Pagini recente » Cod sursa (job #293568) | Cod sursa (job #1639635) | Cod sursa (job #16344) | Cod sursa (job #2857482) | Cod sursa (job #1761270)
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#define INF 2140000000
#define MaxN 16400
#define MOD1 666013
#define MOD2 666019
using namespace std;
int N,X;
pair<int,int>sigmamod[MaxN];
char str[MaxN];
vector <pair<int,int>> h[MOD1];
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();
long long val1=0,val2=0;
int L=0,Max=0;
for(int i=0;i<N;i++)
{
val1=(val1*27+str[i]-'a'+1)%MOD1;
val2=(val2*27+str[i]-'a'+1)%MOD2;
L++;
if(L>lenght)
{
L--;
val1=(1LL*MOD1*MOD1+val1-1LL*(str[i-lenght]-'a'+1)*sigmamod[lenght].first)%(MOD1*1LL);
val2=(1LL*MOD2*MOD2+val2-1LL*(str[i-lenght]-'a'+1)*sigmamod[lenght].second)%(MOD2*1LL);
}
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=(1LL*sigmamod[i-1].first*27)%MOD1;
sigmamod[i].second=(1LL*sigmamod[i-1].second*27)%MOD2;
}
printf("%d",Binary_Search(X));
return 0;
}