分析:
这道题正解是KMP计算失配指针。
http://www.cnblogs.com/zhanzhao/p/4761477.html推荐一个解释比较清晰的网址
巧妙运用了next数组的意义及计算next的方法,能够证明最小的周期是
len/(len−f[len])
如果整除,否则就是1。
/*****************************************************/
//#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <map>
#include <set>
#include <ctime>
#include <stack>
#include <queue>
#include <cmath>
#include <string>
#include <vector>
#include <cstdio>
#include <cctype>
#include <cstring>
#include <sstream>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;
#define offcin ios::sync_with_stdio(false)
#define sigma_size 26
#define lson l,m,v<<1
#define rson m+1,r,v<<1|1
#define slch v<<1
#define srch v<<1|1
#define sgetmid int m = (l+r)>>1
#define ll long long
#define ull unsigned long long
#define lowbit(x) (x&-x)
#define bits(a) __builtin_popcount(a)
const int INF = 0x3f3f3f3f;
const ll INFF = 1e18;
const double pi = acos(-1.0);
const double inf = 1e18;
const double eps = 1e-9;
const ll mod = 1e9+7;
const int maxmat = 10;
const ull BASE = 133333331;
/*****************************************************/
inline void RI(int &x) {
char c;
while((c=getchar())<'0' || c>'9');
x=c-'0';
while((c=getchar())>='0' && c<='9') x=(x<<3)+(x<<1)+c-'0';
}
/*****************************************************/
const int maxn = 1e6 + 5;
char tmp[maxn];
int f[maxn];
void getFail(char *P, int *f) {
int m = strlen(P);
f[0] = f[1] = 0;
for (int i = 1; i < m; i ++) {
int j = f[i];
while (j && P[i] != P[j]) j = f[j];
f[i + 1] = P[i] == P[j] ? j + 1 : 0;
}
}
int main(int argc, char const *argv[]) {
while (~scanf("%s", tmp) && tmp[0] != '.') {
int len = strlen(tmp);
getFail(tmp, f);
if (!(len % (len - f[len]))) printf("%d\n", len / (len - f[len]));
else puts("1");
}
return 0;
}