类型:KMP
题目:给定一个串,求该串的周期数
用next数组记录各个位置的next值
!!!串ababa
// poj 2406
// wa wa ac 5128K 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 = 1000010;
char sp[MAXN];
int 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;
while(scanf("%s", sp + 1) != EOF, sp[1] != '.') {
CLR(p, 0);
m = strlen(sp + 1);
next();
FOR(i, 1, m)
if(p[i] != 0)
break;
if(m % (m - p[m]) == 0)
cout<<m / (m - p[m])<<endl;
else
cout<<"1"<<endl;
}
return 0;
}
/*
ababa
*/