Pagini recente » Cod sursa (job #2380930) | Cod sursa (job #660979) | Cod sursa (job #1888994) | Cod sursa (job #855837) | Cod sursa (job #1755300)
#include <fstream>
#include <algorithm>
using namespace std;
struct kml
{
int a,b;
};
kml w[17000];
int n,k,st,dr,m,i,p1,p2,j,p,maxi;
char v[17000];
bool compara(kml A, kml B)
{
if(A.a!=B.a) return A.a>B.a;
else return A.b>B.b;
}
int val(int e)
{
p1=1;
p2=1;
w[0].a=0;
w[0].b=0;
for(i=0; i<e; i++)
{
w[0].a=(w[0].a*26+(v[i]-'a'))%1000117;
w[0].b=(w[0].b*26+(v[i]-'a'))%100109;
p1=(p1*26)%1000117;
p2=(p2*26)%100109;
}
for(j=1; j+e<=n; j++)
{
w[j].a=(w[j-1].a*26-(p1*(v[j-1]-'a'))%1000117+(v[j+e-1]-'a')+1000117)%1000117;
w[j].b=(w[j-1].b*26-(p2*(v[j-1]-'a'))%100109+(v[j+e-1]-'a')+100109)%100109;
}
sort(w,w+j,compara);
p=1;
maxi=1;
for(i=1; i<j; i++)
{
if(w[i].a==w[i-1].a&&w[i].b==w[i-1].b) p++;
else
{
if(maxi<p) maxi=p;
p=1;
}
}
return maxi;
}
int main()
{
ifstream f("substr.in");
ofstream g("substr.out");
f>>n>>k;
f>>v;
st=1;
dr=n;
while(st+1<dr)
{
m=(st+dr)/2;
if(val(m)<k) dr=m;
else st=m;
}
if(val(dr)>=k) st=dr;
g<<st<<'\n';
f.close(); g.close();
return 0;
}