Pagini recente » Cod sursa (job #1578121) | Cod sursa (job #2435307) | Cod sursa (job #2936112) | Cod sursa (job #1298287) | Cod sursa (job #1165481)
#include <iostream>
#include <fstream>
#include <unordered_map>
using namespace std;
#define mod1 666013
#define mod2 666019
#define pmod 666023
#define p 127
#define maxn 20005
long long vh1[maxn],vh2[maxn],vph1[maxn],vph2[maxn];
pair<int,int> valhash(int l,int r)
{
if (l>r)
return valhash(r,l);
long long valh1,valh2;
valh1=vh1[r]-vh1[l-1]*vph1[r-l+1];
valh1=valh1%mod1;
if (valh1<0)
valh1=valh1+mod1;
valh2=vh2[r]-vh2[l-1]*vph2[r-l+1];
valh2=valh2%mod2;
if (valh2<0)
valh2=valh2+mod2;
return make_pair(int(valh1),int(valh2));
}
int n,k;
bool verify(int l)
{
if (l>n)
return false;
unordered_map <long long,long long > mymap;
unordered_map <long long,long long >::iterator it;
mymap.clear();
pair <int,int> pr;
int i;
long long val;
for (i=l-1;i<n;i++)
{
pr=valhash(i-(l-1),i);
val=(pr.first)*pmod+pr.second;
it=(mymap.insert(make_pair(val,0))).first;
(*it).second++;
if ((*it).second==k)
return true;
}
return false;
}
char s[20002];
long long h1,h2,ph1,ph2,i;
int l,r,ans,mid;
int main(void)
{
FILE * f;
f=fopen("substr.in","r");
ofstream g("substr.out");
fscanf(f,"%d%d",&n,&k);
fgets(s,10,f);
fgets(s,20000,f);
h1=h2=0;
ph1=ph2=1;
for (i=0;i<n;i++)
{
ph1=(ph1*p)%mod1;
ph2=(ph2*p)%mod2;
vph1[i+1]=ph1;
vph2[i+1]=ph2;
h1=(h1*p+s[i])%mod1;
h2=(h2*p+s[i])%mod2;
vh1[i]=h1;
vh2[i]=h2;
}
ans=0;
l=1;
r=20000;
while (l<=r)
{
mid=(l+r)/2;
if (verify(mid))
{
ans=mid;
l=mid+1;
}
else
r=mid-1;
}
g<<ans;
return 0;
}