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
最开始以为是求出现次数最小的那个字符;
后来想一想不对;
然后看着数据不大, 就用暴力枚举的方法;
求出最小的周期,那么就是从最小的开始枚举,也就是长度为1, 再judge;
当然这道题也可以试着暴力模拟(标准的答案),但是我觉得太复杂了。
#include<bits/stdc++.h>
#define clr(x) memset(x, 0, sizeof(x))
#define LL long long
using namespace std;
const int INF = 0x3f3f3f3f;
const int maxn = 100005;
char str[1005];
char s[1005];
int main()
{
int T;
cin >> T;
while(T--)
{
clr(str);
cin >> str;
int len = strlen(str);
for(int i = 0; i < len; i++)
{
if(len % (i+1) != 0)
continue;
int cnt = 0, flag = 1; clr(s);
for(int j = 0; j <= i; j++ )
{
s[cnt++] = str[j];
}
//puts(s);
int tmp = i + 1;
for(int k = 0; k < len / (i + 1) - 1; k++)
{
for(int l = 0; l < cnt; l++)
{
//printf("%c %c\n", s[l], str[tmp]);
if(s[l] != str[tmp++])
{
flag = 0;
break;
}
}
}
if(flag)
{
cout << i + 1 << endl;
if(T)
cout << endl;
break;
}
//puts("_________");
}
}
return 0;
}