字符串长度<10^9查询字符串由最多多少个相同的子串重复连接构成。例如abcdabcdabcd,最多由3个abcd构成。
输入
abcdabcdabcd
输出
3
#include<bits/stdc++.h>
using namespace std;
unsigned long long h[1000005],base=131;
char s[1000005];
int main(){
cin>>s;
int len=strlen(s);
for(int i=0;i<len;i++){ //放在下标1的位置开始
h[i+1]=h[i]*base+s[i];
}
for(int i=1;i<=len;i++){ //枚举子串长度
if(len%i==0){ //abcdabcdabcd
unsigned long long t=h[i];
int j;
cout<<"-------------"<<endl;
for(j=i;j+i<=len;j+=i){
cout<<t<<" "<<h[j+i]-h[j]*pow(base,i)<<endl;
if(t!=h[j+i]-h[j]*(unsigned long long)pow(base,i)){
break;
}
}
if(j==len){
cout<<len/i;
return 0;
}
}
}
return 0;
}
这篇文章介绍了一种使用C++编程语言实现的算法,通过哈希函数和子串长度的枚举来找出给定字符串中可以重复最多次的相同子串。代码展示了如何找到如abcdabcdabcd中最多可由3个abcd重复构成的情况。
3434





