Description
There is a string A. The length of A is less than 1,000,000. I rewrite it again and again. Then I got a new string: AAAAAA...... Now I cut it from two different position and get a new string B. Then, give you the string B, can you tell me the length of the shortest possible string A. For example, A="abcdefg". I got abcd
efgabcdefgabcdefgabcdefg.... Then I cut the red part: efgabcdefgabcde as string B. From B, you should find out the shortest A.
Input
Multiply Test Cases. For each line there is a string B which contains only lowercase and uppercase charactors. The length of B is no more than 1,000,000.
Output
For each line, output an integer, as described above.
Sample Input
bcabcab efgabcdefgabcde
Sample Output
37
这是一道kmp的简单或者说是模板题,但他让我真正理解了kmp的含义,推翻了我以前错误的理解。
大家都知道kmp算法的核心是next的求值。我会专门写一篇博文来讲解这个kmp,毕竟我也迷茫了半个学期了快
一个字略晕
#include <iostream> #include <stdio.h> #include <algorithm> #include <string.h> #include <stdlib.h> #include <math.h> using namespace std; int next[1000012]; char s[1000012]; void solve() { int j,k,i,max1=0; i=strlen(s); j=0; k=-1; next[0]=-1; while(j<i) { if(k==-1||s[j]==s[k]) { j++; k++; next[j]=k; max1=max1>k?max1:k; } else k=next[k]; } printf("%d\n",i-next[i]); } int main() { while(gets(s)) { memset(next,0,sizeof(next)); solve(); } return 0; }