原题:
A character string is said to have period k if it can be formed by concatenating one or more repetitions of another string of length k. For example, the string ”abcabcabcabc” has period 3, since it is formed by 4 repetitions of the string ”abc”. It also has periods 6 (two repetitions of ”abcabc”) and 12 (one repetition of ”abcabcabcabc”). Write a program to read a character string and determine its smallest period.
Input
The first line oif the input file will contain a single integer N indicating how many test case that your program will test followed by a blank line. Each test case will contain a single character string of up to 80 non-blank characters. Two consecutive input will separated by a blank line.
Output
An integer denoting the smallest period of the input string for each input. Two consecutive output are separated by a blank line. Sample Input
1
HoHoHo
Sample Output
2
大意:
如果一个字符串可以由某个长度为k的字符串重复多次得到,则称该串以k为周期。例如,abcabcabcabc以3为周期(注意,它也以6和12为周期)。
输入一个长度不超过80的字符串,输出其最小周期。
分析:
对于每一个字符串,k的可能取值为1-n(n为字符串的长度),其中还可以跳过那些,n%k!=0的情况,比如长度为12的字符串,那么k只可能是1,2,3,4,6,12.
所以我们用一个for循环从1开始找,f 函数即用来判断当前的 i 是不是答案,如果是的话就返回1,然后找啊找啊,如果到最后一个元素的前一个,即n-1,还不是,循环结束,注意此时的 i 会++,即此时 i = n,刚刚好是正确答案(因为前面找遍了,没有找到答案)
然后注意输出格式,多组输出,每组用空行分开,最后一行的行末不要有多余的空行。
下面是AC代码:
#include<iostream>
using namespace std;
int f(int i,string s)
{
int flag=1;
int temp=i;
int j=0;
while(i<s.length()&&flag)
{
for(j=0; j<temp&&i+j<s.length(); j++)
{
if(s[j]!=s[j+i])
{
flag=0;
break;
}
}
i+=temp;
}
return flag;
}
int main()
{
int T;
cin>>T;
while(T--)
{
string s;
cin>>s;
int i;
for(i=1; i<s.length(); i++)
{
if(s.length()%i)continue;
if(f(i,s))break;
}
if(T)cout<<i<<endl<<endl;
else cout<<i<<endl;
}
return 0;
}
Over.