Pagini recente » Cod sursa (job #2868741) | Cod sursa (job #540618) | Cod sursa (job #1467683) | Cod sursa (job #3175547) | Cod sursa (job #2221585)
#include<fstream>
#include<cstring>
#include<unordered_map>
#define DN 16384
#define M1 6013
#define M2 5581
#define P 173
using namespace std;
ifstream fin("substr.in");
ofstream fout("substr.out");
int n,k,put1[DN],put2[DN],r1[DN],r2[DN],st,dr,mij;
char a[DN];
int vf(int f)
{
int a,b,ma=0;
unordered_map<int,int>mp;
for(int i=f;i<=n;i++)
{
a=(r1[i]+M1-(put1[f]*r1[i-f])%M1)%M1;
b=(r2[i]+M2-(put2[f]*r2[i-f])%M2)%M2;
a=a*10000+b;
mp[a]++;
ma=max(ma,mp[a]);
}
if(ma>=k)
return 1;
return 0;
}
int main()
{
fin>>n>>k;
fin.getline(a+1,DN);
fin.getline(a+1,DN);
put1[0]=put2[0]=1;
for(int i=1;i<DN;i++)
{
put1[i]=(put1[i-1]*P)%M1;
put2[i]=(put2[i-1]*P)%M2;
}
for(int i=1;i<=n;i++)
{
r1[i]=(r1[i-1]*P+a[i]-'a')%M1;
r2[i]=(r2[i-1]*P+a[i]-'a')%M2;
}
st=1;
dr=n;
while(st<dr)
{
mij=(st+dr+1)/2;
if(vf(mij))
st=mij;
else
dr=mij-1;
}
fout<<st;
}