Pagini recente » Cod sursa (job #628502) | Borderou de evaluare (job #478889) | Cod sursa (job #1050906) | Cod sursa (job #555948) | Cod sursa (job #1500916)
#include <fstream>
#include <map>
using namespace std;
ifstream f("substr.in");
ofstream g("substr.out");
int N,K;
const int MOD1 = 1000007;
const int MOD2 = 1000021;
const int Base = 73;
char Str[16385];
int Code[155];
bool ok=0;
map <pair<int,int>,int> M;
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[make_pair(h1,h2)]++;
if(M[make_pair(h1,h2)]>=K)
ok=1;
}
void Read()
{
f>>N>>K;
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=1,p2=1;
for(int i=1;i<length;i++)
{
p1*=Base;
p2*=Base;
p1%=MOD1;
p2%=MOD2;
}
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;
}
M.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;
}