Pagini recente » Cod sursa (job #1280872) | Cod sursa (job #2473755) | Cod sursa (job #1491471) | Cod sursa (job #226938) | Cod sursa (job #1761287)
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#define INF 2140000000
#define MaxN 16400
#define MOD1 100003
#define MOD2 100153
using namespace std;
int N,X;
pair<int,int>sigmamod[MaxN];
char str[MaxN];
vector <pair<int,int>> h[MOD1];
int alpha(char x)
{
if(x>='0'&&x<='9')
return 1+x-'0';
else if(x>='a'&&x<='z')
return 11+x-'a';
else return 37+x-'A';
}
void Clear_Hash()
{
memset(h,0,sizeof h);
}
void Add_To_Hash(int x1,int x2,int &Max)
{
for(int i=0;i<h[x1].size();i++)
if(h[x1][i].first==x2)
{
Max=max(Max,++h[x1][i].second);
return;
}
h[x1].push_back(make_pair(x2,1));
Max=max(Max,1);
}
int Rabin_Kerp(int lenght)
{
Clear_Hash();
int val1=0,val2=0;
int L=0,Max=0;
for(int i=0;i<N;i++)
{
val1=(val1*63+alpha(str[i]))%MOD1;
val2=(val2*63+alpha(str[i]))%MOD2;
L++;
if(L>lenght)
{
L--;
val1=(100*MOD1+val1-alpha(str[i-lenght])*sigmamod[lenght].first)%MOD1;
val2=(100*MOD2+val2-alpha(str[i-lenght])*sigmamod[lenght].second)%MOD2;
}
if(L==lenght)
Add_To_Hash(val1,val2,Max);
}
return Max;
}
int Binary_Search(int val)
{
int lw=1,hi=N,mid,last=1,x;
while(lw<=hi)
{
mid=(lw+hi)>>1;
x=Rabin_Kerp(mid);
if(x>=val)
{
lw=mid+1;
last=mid;
}
else hi=mid-1;
}
return last;
}
int main()
{
freopen("substr.in","r",stdin);
freopen("substr.out","w",stdout);
scanf("%d%d %s",&N,&X,&str);
sigmamod[0]=make_pair(1,1);
for(int i=1;i<=N;i++)
{
sigmamod[i].first=(sigmamod[i-1].first*63)%MOD1;
sigmamod[i].second=(sigmamod[i-1].second*63)%MOD2;
}
printf("%d",Binary_Search(X));
return 0;
}