传送门:POJ3261
傻逼题,Hash即可。
我把Hash的后缀函数打错了我会乱说?
代码上的小细节见下。
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
const unsigned long long x=10007;
unsigned long long hash[100005];
int n,m;
int da[1000005];
unsigned long long ans[100005];
unsigned long long power[100005];
int need;
void Hash()
{
hash[n]=da[n];
power[0]=1;
for(int i=1;i<=n;i++)
power[i]=power[i-1]*x;
for(int i=n-1;i>=0;i--)
hash[i]=hash[i+1]*x+da[i];
}
bool Judge(int k)
{
if(k==0)
return true;
for(int i=1;i<=n-k+1;i++)
ans[i]=hash[i]-hash[i+k-1]*power[k-1];
sort(ans+1,ans+n-k+2);
ans[0]=-1;
int jec=0,num=0;
for(int i=1;i<=n-k+1;i++){
if(ans[i]!=ans[i-1])
jec=1;
else
jec++;
num=max(num,jec);
}
return num>=need;
}
void Debug()
{
hash[1]=da[1];
for(int i=2;i<=5;i++)
hash[i]=hash[i-1]*x+da[i];
cout<<hash[5]<<endl;
hash[2]=da[2];
for(int i=3;i<=6;i++)
hash[i]=hash[i-1]*x+da[i];
cout<<hash[6]<<endl;
}
void Solve()
{
int l=0,r=n;
while(l<r){
int mid=(l+r)/2;
if(Judge(mid+1))
l=mid+1;
else
r=mid;
}
printf("%d\n",l);
}
void Readdata()
{
freopen("loli.in","r",stdin);
scanf("%d%d",&n,&need);
for(int i=1;i<=n;i++)
scanf("%d",&da[i]);
}
void Close()
{
fclose(stdin);
fclose(stdout);
}
int main()
{
Readdata();
Hash();
Solve();
Close();
return 0;
}