标签:col bre bit http c++ ati bool 字符 ring
题目描述
给出一个字符串,求它最多由多少个相同的字符串重复链接形成。
思路
其实题目就是要我们求出最小循环节的长度,再用字符串长度除以这个长度就是答案。求最小循环节显然用KMP就可以,但这里我们也可以用字符串Hash做。我们只需要暴力枚举每一个前缀的Hash值,再看之后每一段的Hash值是否等于它即可。
代码
#include <bits/stdc++.h> using namespace std; typedef unsigned long long ull; const ull p=47; ull sum[1000005],power[1000005]; char s[1000005]; int main() { power[0]=1; for(int i=1;i<1000000;i++) power[i]=power[i-1]*p; while(~scanf(" %s",s+1)) { if(s[1]==‘.‘)break ; int len=strlen(s+1); for(int i=1;i<=len;i++) sum[i]=sum[i-1]*p+s[i]; for(int i=1;i<=len;i++) if(len%i==0) { ull s1=sum[i]; bool f=1; // cout<<i<<‘ ‘<<s1<<endl; for(int j=i;j<=len-i;j+=i) if(s1!=sum[j+i]-sum[j]*power[i]){f=0;break ;} if(f||i==len){printf("%d\n",len/i);break ;} } } return 0; }
标签:col bre bit http c++ ati bool 字符 ring
原文地址:https://www.cnblogs.com/fangbozhen/p/11619348.html