Hash Killer II #include<bits/stdc++.h> using namespace std; int n=100000,l; long long a[100005]; string s; int main(){ srand(time(0)); for(int i=1;i<=n;i++){ char c=rand()%26+97; s+=c; } l=20; cout<<n<<" "<<l<<"\n"; cout<<s; return 0; } 双哈希模板 #include<bits/stdc++.h> using namespace std; const int N=100005; struct stu HASH{ long long sed,mod,h[N],pw[N]; void init(long long sed_in,long long mod_in){ sed=sed_in,mod=mod_in; pw[0]=1; for(int i=1;i<N;i++){ pw[i]=pw[i-1]*sed%mod; } } void make(string s){ h[1]=s[1]%mod; for(int i=2;i<=s.size();i++){ h[i]=(h[i-1]*sed%mod+s[i])%mod; } } long long get(int l,int r){ return (h[r]-h[l-1]*pw[r-l+1]%mod+mod)%mod; } }; int main(){
return 0; } 不同字串 #include<bits/stdc++.h> using namespace std; const int N=1000005; int n,l,cnt; string s; struct stu HASH{ long long sed,mod,h[N],pw[N]; void init(long long sed_in,long long mod_in){ sed=sed_in,mod=mod_in; pw[0]=1; for(int i=1;i<N;i++){ pw[i]=pw[i-1]*sed%mod; } } void make(string s){ h[1]=s[1]%mod; for(int i=2;i<=s.size();i++){ h[i]=(h[i-1]*sed%mod+s[i])%mod; } } long long get(int l,int r){ return (h[r]-h[l-1]*pw[r-l+1]%mod+mod)%mod; } }t1,t2; int main(){ cin>>n>>l; cin>>s; t1.init(131,1e9+7); t2.init(128,998244353); s=" "+s; t1.make(s); t2.make(s); for(int i=1;i<=n-l+1;i++){ cnt++; p[cnt].first=t1.get(i,i+l-1); p[cnt].second=t2.get(i,i+l-1); } sort(p+1,p+1+n-l+1); int ans=1; for(int i=2;i<=n-l+1;i++){ if(p[i]!=p[i-1]){ ans++; } } cout<<ans; return 0; }