POJ上超时,而且x选择对时间影响很大。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=40000+5;
const int x=123;
char s[maxn];
int n,m,pos;
unsigned long long H[maxn],xp[maxn];
unsigned long long ha[maxn];
int rak[maxn];
int cmp(const int &i,const int &j)
{
return ha[i]<ha[j]||(ha[i]==ha[j]&&i<j);
}
bool possible(int L)
{
int c=0;
pos=-1;
for(int i=0;i<n-L+1;i++)
{
rak[i]=i;
ha[i]=H[i]-H[i+L]*xp[L];
}
sort(rak,rak+n-L+1,cmp);
for(int i=0;i<n-L+1;i++)
{
if(i==0||ha[rak[i]]!=ha[rak[i-1]]) c=0;
if(++c>=m) pos=max(pos,rak[i]);
}
return pos>=0;
}
#define ss(x) scanf("%d",&x)
int main()
{
while(true)
{
ss(m);if(m==0) break;
scanf("%s",s);
n=(int)strlen(s);
H[n]=0;
for(int i=n-1;i>=0;i--) H[i]=H[i+1]*x+(s[i]-'a');
xp[0]=1;
for(int i=1;i<=n;i++) xp[i]=xp[i-1]*x;
if(!possible(1)) printf("none\n");
else{
int L=1,R=n+1;
while(L<R)
{
int M=L+(R-L+1)/2;
if(possible(M)) L=M;
else R=M-1;
}
possible(L);
printf("%d %d\n",L,pos);
}
}
return 0;
}