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 }