如果一个字符串可以被某个长度为 kk 的字符串重复一次或多次得到,则称这个字符串的周期为 kk。例如,字符串 abcabcabcabc
以 33 为周期(当然,它也以 6,126,12 等等为周期)。
现在请你编写一个程序,求出任一长度不超过 8080 的字符串的最小正周期。
输入
输入首先是一个整数 n \ (1 \leq T \leq 1000)n (1≤T≤1000),代表有 nn 组数据。
每组数据占一行,是一个长度不超过 8080 的字符串,保证字符串中只有英文字母。
两组相邻的输入之间有一个空行。
输出
每组数据在一行内输出一个整数 kk,代表该字符串的最小正周期。
两组相邻的输出之间应当有一个空行。
P.s.: 如果字符串最小正周期串是它本身,则 k=k= 字符串长度。
样例
标准输入复制文本 |
2 abcabcabc HoHoHo |
标准输出复制文本 |
3 2 |
#include<bits/stdc++.h>
using namespace std;
int main()
{ int t;
cin>>t;
while(t--)
{
char word[100];
int len,flag;
scanf("%s",word);
len = strlen(word);
for(int i=1;i<=len;i++) //假设最小周期(最小周期串长度)为i
{
if(len%i==0) //字符串长度一定是周期的倍数
{
flag=1;
for(int j=i;j<len;j++)
{ //从周期i的下一个位置j(因为数组是从0开始的,所以下一个位置的索引j等于周期i)开始
if(word[j]!=word[j%i]) //和前面假设的周期串中字符逐个比较
{
flag=0; //如果发现出现一个不相等了,说明这个i不是周期
break; //退出循环比较,递增假设的周期i
}
}
if(flag) //循环比较完,仍找不到不相等的就可以确定i是最小周期
{
printf("%d\n\n",i);
break;
}
}
}
}
return 0;
}