原题:
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
中文
给你个字符串,让你找最小的循环周期
#include <bits/stdc++.h>
using namespace std;
const int maxnum=1000000;
int Next[maxnum];
char p[maxnum];
int plen;
void GetNext(char* p,int pLen)
{
Next[0] = -1;
int k = -1;
int j = 0;
while (j < pLen)
{
if (k == -1 || p[j] == p[k])
{
++k;
++j;
Next[j] = k;
}
else
{
k = Next[k];
}
}
}
int main()
{
ios::sync_with_stdio(false);
int t;
cin>>t;
while(t--)
{
cin>>p;
int ans;
plen=strlen(p);
GetNext(p,plen);
ans=0;
if(plen%(plen-Next[plen]));
cout<<plen<<endl;
else
{
ans=(plen-Next[plen]);//plen-Next[plen]就是找一个循环节的长度
cout<<ans<<endl;
}
if(t)
cout<<endl;
}
return 0;
}
思路:
在紫书上面找了个简单字符串练练手,结果发现kmp可以解决~ 利用kmp算法的前缀数组找最小循环节即可
字符串总长度是plen
周期是plen-Next[lpen]
先判断是不是一个周期串plen%(plen-Next[plen]),如果能整除则为周期串,否则就是一个不成周期的字符串,输出原来长度即可