类型:KMP
来源:POJ Monthly--2006.01.22,Zeyuan Zhu
题目:给定一个串,求其所有的即是其前缀又是其后缀的串的长度,从小到大输出
串本身即是其前缀又是其后缀,然后就是next[len]了,依次进行直到next[i] = 0
// poj 2752
// ac 2556K 157MS
#include <iostream>
#include <string>
#include <cstdio>
#include <cstring>
using namespace std;
#define FOR(i,a,b) for(i = (a); i < (b); ++i)
#define FORE(i,a,b) for(i = (a); i <= (b); ++i)
#define FORD(i,a,b) for(i = (a); i > (b); --i)
#define FORDE(i,a,b) for(i = (a); i >= (b); --i)
#define CLR(a,b) memset(a,b,sizeof(a))
const int MAXN = 400010;
char sp[MAXN];
int m, cnt;
int p[MAXN], end[MAXN];
void next() {
int k = 0, i;
p[1] = 0;
FORE(i, 2, m) {
while(k > 0 && sp[i] != sp[k + 1])
k = p[k];
if(sp[k + 1] == sp[i])
k = k + 1;
p[i] = k;
}
}
int main() {
int i, j;
while(scanf("%s", sp + 1) != EOF) {
CLR(p, 0);
cnt = 0;
m = strlen(sp + 1);
next();
end[cnt++] = m;
i = m;
while(p[i] != 0) {
end[cnt++] = p[i];
i = p[i];
}
FORDE(i, cnt - 1, 0)
(i == cnt - 1) ? printf("%d", end[i]) : printf(" %d", end[i]);
printf("\n");
}
return 0;
}
4335

被折叠的 条评论
为什么被折叠?



