Pagini recente » Cod sursa (job #1900874) | Cod sursa (job #2894614) | Cod sursa (job #1503892) | Cod sursa (job #1121380) | Cod sursa (job #1500928)
#include <fstream>
#include <map>
using namespace std;
ifstream f("substr.in");
ofstream g("substr.out");
int N,K;
const int MOD1 = 100007;
const int MOD2 = 100021;
const int Base = 73;
char Str[16385];
int Code[155];
int Power1[16385],Power2[16385];
bool ok=0;
map <int,int> M[MOD1];
void Insert(int h1,int h2)
{
/*if(M.count(make_pair(h1,h2))==0)
M.insert(make_pair(make_pair(h1,h2),1));
else*/
M[h1][h2]++;
if(M[h1][h2]>=K)
ok=1;
}
void Read()
{
f>>N>>K;
Power1[0]=Power2[0]=1;
for(int i=1;i<=N;i++)
Power1[i]=Power1[i-1]*Base,Power1[i]%=MOD1,Power2[i]=Power2[i-1]*Base,Power2[i]%=MOD2;
char ch;
f.get(ch);
f.getline(Str,16385);
for(int i=0;i<=9;i++)
Code[i+'0']=i;
for(int i='A';i<='Z';i++)
Code[i]=i-'A'+10;
for(int i='a';i<='z';i++)
Code[i]=i-'a'+36;
}
int Solve(int length)
{
int h1=0,h2=0,p1=Power1[length-1],p2=Power2[length-1];
for(int i=0;i<length;i++)
{
h1=h1*Base+Code[Str[i]];
h1%=MOD1;
h2=h2*Base+Code[Str[i]];
h2%=MOD2;
}
Insert(h1,h2);
for(int i=length;i<N;i++)
{
h1-=p1*Code[Str[i-length]];
h2-=p2*Code[Str[i-length]];
h1%=MOD1;
h1+=MOD1;
if(h1>=MOD1)
h1-=MOD1;
h2%=MOD2;
h2+=MOD2;
if(h2>=MOD2)
h2-=MOD2;
h1=h1*Base+Code[Str[i]];
h1%=MOD1;
h2=h2*Base+Code[Str[i]];
h2%=MOD2;
Insert(h1,h2);
if(ok==1)
break;
}
for(int i=0;i<MOD1;i++)
M[i].clear();
return ok;
}
void binSearch()
{
int left=1,right=N,mid,sol=0;
while(left<=right)
{
mid=(left+right)/2;
if(Solve(mid)==1)
{
sol=mid;
left=mid+1;
}
else
right=mid-1;
ok=0;
}
g<<sol<<"\n";
}
int main()
{
Read();
binSearch();
return 0;
}