自己稀里糊涂就过了,,原来是数据水。。但也还是不知道自己的代码其实能不能过,还是先放一下,,再看看能不能看得懂。。
id=97
对S串做个kmp得到fail数组,答案就是:
n = S.length();
while(fail[n] != -1) ans.push_back(S.length() - fail[n]), n = fail[n];
证明:由fail[n]可知,S[i] = S[i+S.length()-fail[n]] ( 0 <= i < fail[n] )其实就是满足了循环节为S.length()-fail[n]的定义。
很多人都是找了个循环串然后输出了个等差数列,这都是错的。比如下面的样例:
ababbababbaba
4
5 10 12 13
int ans[N], cnt;
int main() {
while(~scanf("%s", s)) {
int n = strlen(s);
int j = -1, i = 0;
f[0] = -1;
while(i < n) {
if( j < 0 || s[i] == s[j]) {
++i, ++j;
f[i] = j;
}
else j = f[j];
}
cnt = 0;
i = n;
while(f[i] != -1) {
ans[cnt++] = n-f[i];
i = f[i];
}
cout<<cnt<<endl;
for(int i = 0; i < cnt; ++i)
printf("%d%c", ans[i], i == cnt-1 ? '\n' : ' ');
}
}
720

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



