【伯俊】1305号広告/Java,Python
Baekjoon Online Judge
algorithm practice
-問題を逐次解く
34.文字列アルゴリズム1
KMPアルゴリズムとtrieデータ構造について議論する.
3.広告
1305号
KMP障害機能を利用した問題2
この問題は、ある瞬間にスクリーンを見つめているときに、文字を入力するときに、できるだけ広告の長さの中で最も短いものを出力することです.
文字列では、接頭辞-接尾辞は同じ文字列の最大長を求めます.
文字列に同じパターンがある場合は、最も短いパターンを見つけることです.パターンの最大長さはN
KMPアルゴリズムを用いて実現することができる.Pi配列を使用します.
Java/Python
import java.io.*;
public class Main {
public static void main(String args[]) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int N = Integer.parseInt(br.readLine());
String str = br.readLine();
// KMP 알고리즘
// 접두사&접미사 동일한 문자열 최대 길이 구하기
int[] pi = getLastPi(str);
bw.write(N - pi[N - 1] + "\n");
bw.flush();
bw.close();
br.close();
}
// pi배열 최대 패턴의 길이 구하기
static int[] getLastPi(String ptn) {
int j = 0;
int len = ptn.length();
int[] pi = new int[len];
for (int i = 1; i < len; i++) {
while (j > 0 && ptn.charAt(i) != ptn.charAt(j)) {
j = pi[j - 1];
}
if (ptn.charAt(i) == ptn.charAt(j)) {
pi[i] = ++j;
}
}
return pi;
}
}
import sys
input = sys.stdin.readline
def getPi(P):
pi = [0 for _ in range(0, len(P))]
j = 0
for i in range(1, len(P)):
while j > 0 and P[i] != P[j]:
j = pi[j - 1]
if (P[i] == P[j]):
j += 1
pi[i] = j
return pi
N = int(input())
ptn = input()
print(N - getPi(ptn)[N-1])
Reference
この問題について(【伯俊】1305号広告/Java,Python), 我々は、より多くの情報をここで見つけました https://velog.io/@jini_eun/백준-1305번-광고-Java-Pythonテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol