1 /* 2 * KMP 3 * 思路:把两个串连接,然后求next[]数组值 4 * 注意:当两个串都是重复串且重复子串一样是,要特殊处理 5 */ 6 7 #include <cstdio> 8 #include <iostream> 9 10 using namespace std; 11 12 const int N = 50005; 13 14 int next[N<<1]; 15 char str[N<<1], pat[N]; 16 17 void indexNext() { 18 int k = 0; 19 next[1] = 0; 20 for (int i=2; str[i]; ++i) { 21 while (k && str[k+1]!=str[i]) k = next[k]; 22 if (str[k+1] == str[i]) ++k; 23 next[i] = k; 24 } 25 } 26 27 void solve() { 28 int lenPat = strlen(pat); 29 int lenStr = strlen(str); 30 int len = lenStr + lenPat - 1; 31 for (int i=1; i<lenPat; ++i) str[lenStr+i-1] = pat[i]; 32 str[len] = '\0'; 33 indexNext(); 34 if ((len-1)%(len-next[len-1]-1)==0 && next[len-1]!=0) {//特殊处理的数据 35 if (lenStr > lenPat) lenStr = lenPat; 36 for (int i=1; i<lenStr; ++i) printf ("%c", str[i]); 37 printf (" %d\n", lenStr-1); 38 } 39 else if (next[len-1] == 0) printf ("0\n"); 40 else { 41 for (int i=1; i<=next[len-1]; ++i) printf ("%c", str[i]); 42 printf (" %d\n", next[len-1]); 43 } 44 } 45 46 int main() { 47 str[0] = pat[0] = '#'; 48 while (scanf("%s%s", str+1, pat+1) != EOF) { 49 solve(); 50 } 51 return 0; 52 }