1457 Power Strings
嗯?貌似这个题正解是KMP啊
题意不难理解,就是找一个字符串的最长循环节的长度
然后我们把每一段的也就是类似于前缀的东西维护一下hash值
接下来枚举每一段,用函数核查一下,至于核查函数其实和枚举差不多,没有什么难得地方,从这里可以看出来,hash得优化并不是从查找上优化,而是从长度上优化
#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
const int SIZE=1e6+10;
ull hash[SIZE];
ull power[SIZE];
ull base=131,mod=1<<31;
char s[SIZE];
int l;
bool check(ull h,int k)
{
for(ull i=0;i<l;i+=k)//每一段
{
if(hash[i+k]-hash[i]*power[k]!=h) return 0;//枚举匹配,只要有部分不匹配都不行
}
return 1;
}
int main()
{
power[0]=1;
for(int i=1;i<=101000;i++) power[i]=power[i-1]*base;
while(scanf("%s",s+1))
{
if(s[1]=='.') break;
l=strlen(s+1);
hash[0]=0;
for(int i=1;i<=l;i++) hash[i]=hash[i-1]*base+(ull)(s[i]-'A'+1);//每一段字符串转化hash
for(int i=1;i<=l;i++)
{
if(l%i==0)
{
if(check(hash[i],i)==1)//检查hahs[i]是不是循环节
{
cout<<l/i<<endl;//从前往后枚举,只要枚举到了,说明是最小的,相除成最大的
break;
}
}
}
}
return 0;
}