题目传送:POJ - 2752
思路:就是每次都去找当前串的最大相同前缀后缀,找到一个后,令该相同前缀后缀为当前串,再循环调用,注意因为kmp的next函数中的最大相同前缀后缀不包含自身,所以每次都要多输出原串自身长度
AC代码:
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn = 1000005; char s[maxn]; int next[maxn]; int ans[maxn]; int len; void get_next(char *s) { next[0] = -1; int i = 0, j = -1; while(i < len) { if(j == -1 || s[i] == s[j]) next[++ i] = ++ j; else j = next[j]; } } int main() { while(scanf("%s", s) != EOF) { int tot = 0; len = strlen(s); get_next(s); int tmp = next[len]; if(tmp != 0) { ans[tot ++] = tmp; } while(next[tmp] > 0) { tmp = next[tmp]; ans[tot ++] = tmp; } for(int i = tot - 1; i >= 0; i --) { printf("%d ", ans[i]); } printf("%d\n", len); } return 0; }
时间: 2024-10-05 04:27:44