类型:KMP
题目:http://acm.hdu.edu.cn/showproblem.php?pid=3746
来源:HDU 3rd “Vegetable-Birds Cup” Programming Open Contest
思路:
(1)字符加在前后等价
(2)注意非周期串的特殊情况:ababa
// hdoj 3746 Cyclic Nacklace
// ac 125MS 712K
#include <iostream>
#include <string>
#include <algorithm>
#include <cmath>
#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 max(a,b) ((a) > (b)) ? (a) : (b)
#define min(a,b) ((a) < (b)) ? (a) : (b)
#define CLR(a,b) memset(a,b,sizeof(a))
#define PB(x) push_back(x)
const int MAXN = 110010;
char st[MAXN], sp[MAXN];
int n, cnt, len, m;
int p[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;
scanf("%d", &n);
while(n--) {
scanf("%s", sp + 1);
m = strlen(sp + 1);
next();
int t = m - 2 * p[m];
if(p[m] > 0 && p[m] > m / 2) {
if(m % (m - p[m]) != 0) {
FORDE(j, m - 1, 1)
if(j % (j - p[j]) == 0) {
t = (j - p[j]) - (m - (m / (j - p[j])) * (j - p[j]));
break;
}
}
}
if(t <= 0)
t = 0;
printf("%d\n", t);
}
return 0;
}
/*
ababa
*/