一道KMP的题。
知识点:1.kmp[i]可能等于0
2.手玩是个好东西
for(int i = k + 1;i < lena;i++) { if(kmp[i] >= k) { if(k != 0) for(int i = 1;i <= k;i++)printf("%c",c[i]); return 0; } }
3.这一段查找1~i这段串中是否有前缀个人觉得是比较妙的。
#include <bits/stdc++.h> using namespace std; char c[3000002]; int kmp[3000002]; int lena; int main() { scanf("%s",c + 1); lena = strlen(c + 1); int j = 0; for(int i = 2;i <= lena;i++) { while(j && c[j + 1] != c[i])j = kmp[j]; if(c[j + 1] == c[i])j++; kmp[i] = j; } int k = kmp[lena]; if(k == 0)//错误1:没想到kmp[lena]可能等于0,导致一开始有一个点没输出。 { printf("Just a legend"); return 0; } for(int i = k + 1;i < lena;i++) { if(kmp[i] >= k) { if(k != 0) for(int i = 1;i <= k;i++)printf("%c",c[i]); return 0; } } if(kmp[k] == 0 || k == 0) {printf("Just a legend"); return 0; } else { for(int i = 1;i <= kmp[k];i++)printf("%c",c[i]); return 0; } return 0; }