题意:题目很短,我们先来猜一波题意,看样例我们口胡一波,可能是求一个字符串S,最多是由一个字符串复制几次得到
思路:队里kmp都不怎么好,抽时间学一下(多谢神犇们的博客,传送门),我们了解了题意之后,我们利用kmp的next数组性质可以容易的得到一个串S的最小循环节是|S|-next[s]得到的,如果得到的循环节长度可以被|S|整出,那么我们可以得到一个最小循环节,如果不能整除,则表示我们需要增加一些字符串使其形成新的循环节
代码:(get新技能,退役老年人手撕next数组)
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; const int maxn=1e6+7; char a[maxn]; int next[maxn]; int len; void getnext() { int j=0,k=-1; next[0]=-1; while(j<len){ if(a[j]==a[k]||k==-1)next[++j]=++k; else k=next[k]; } } int main() { while(~scanf("%s",a)){ if(a[0]=='.')break; len=strlen(a); getnext(); int ans=len-next[len]; if(len%ans)puts("1"); else{ printf("%d ",len/ans); } } return 0; }