类型:KMP[经典]
题目:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3163
思路:枚举前缀,不断更新当前max值字符串为周期串的条件是n % (n - next[n]) = 0
子串个数x为1时特殊考虑数据: aba
答案:3 0 0参考:http://blog.csdn.net/allenjy123/article/details/6629885
// uva 12012
// wa ac
#include <iostream>
#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 FORDE(i,a,b) for(i = (a); i >= (b); --i)
#define CLR(a,b) memset(a,b,sizeof(a))
const int MAXN = 1010;
char st[MAXN], sp[MAXN];
int n, len, m;
int p[MAXN], ans[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;
}
}
void solve() {
int i, j, k;
FORE(i, 1, len) {
strcpy(sp + 1, st + i);
m = strlen(sp + 1);
CLR(p, 0);
next();
FORE(j, 1, m) {
int x = j - p[j];
//!!!
if(j % x == 0) {
int tmp = j / x;
//!!!
FORE(k, 1, tmp)
ans[k] = max(ans[k], j - (tmp % k) * x);
}
}
}
}
int main() {
int i, T;
int cas = 1;
scanf("%d", &T);
while(T--) {
scanf("%s", st + 1);
len = strlen(st + 1);
CLR(ans, 0);
solve();
printf("Case #%d:", cas++);
FORE(i, 1, len)
(i == 1) ? printf(" %d", len) : printf(" %d", ans[i]);
printf("\n");
}
return 0;
}