洛谷似乎没有,题面在这里。
#include<bits/stdc++.h>
#define MAXN 400004
#define HASH 31
#define map unordered_map
//#undef map
using namespace std;
typedef unsigned long long ull;
int m,len;
char s[MAXN];
ull base[MAXN],pre[MAXN];
inline ull get_hash(int l,int r){
return pre[r]-pre[l-1]*base[r-l+1];
}
inline int check(int mid){
map<ull,int> mp;
int ans=-1;
for(int i=1;i<=len-mid+1;++i){
int hsh=get_hash(i,i+mid-1);
++mp[hsh];
if(mp[hsh]>=m){
ans=i;
}
}
return ans;
}
int main(){
while(scanf("%d",&m)&&m){
scanf("%s",s+1);
len=strlen(s+1);
base[0]=1;
for(int i=1;i<=len;++i){
base[i]=base[i-1]*HASH;
pre[i]=pre[i-1]*HASH+s[i]-'a';
}
int l=1,r=len;
pair<int,int> ans;
if(check(1)==-1){
puts("none");
continue;
}
while(l<=r){
int mid=(l+r+1)>>1;
int x=check(mid);
if(x!=-1){
l=mid+1;
ans=make_pair(mid,x-1);
}else{
r=mid-1;
}
}
printf("%d %d\n",ans.first,ans.second);
}
return 0;
}
时间复杂度应该没有问题,但是 T 了 Test2。