题意 一个串可以被几个相同的子串叠加形成~给你一个串,找到满足要求的最小子串,最后输出几个这样的子串可以构成原串~
思路 假设该串可以被不是它本身的子串按题意产生。那么由next[n](n是字符串长度),一定会形成类似的样子: |_____|__|,中间的|表示next[n]位置。(1)如果后半的串可以被n整除,那么可以形成|___|___|___|___|类似的样子(每段标号1,2,3,4),由next数组性质可以知道:4=3,3=2,2=1,所以可以被这个子串形成原串,且这是最短子串,否则next[n]位置还可以后移。(2)如果不能被整除,类似的我们可以知道,最后没有2=1,因为长度不同,所以不行。最后按照这个结论实现以下就好~
#include <stdio.h>
#include <string.h>
#define maxn 1000006
char str[maxn];
int next[maxn];
int n;
void getNext()
{
int i,j;
next[0] = next[1] = 0;
for(i=1;i<n;i++)
{
j = next[i];
while(j && str[i] != str[j])
j = next[j];
if(str[i] == str[j])
next[i+1] = j+1;
else
next[i+1] = 0;
//printf("%d\n",next[i+1]) ;
}
}
int main()
{
while(gets(str) && strcmp(str,"."))
{
n = strlen(str);
getNext();
//printf("%d\n%d\n",next[n],n);
if(n % (n - next[n])==0)
printf("%d\n",n/(n-next[n]));
else
puts("1");
}
return 0;
}