Cod sursa(job #1761262)

Utilizator GabiTulbaGabi Tulba-Lecu GabiTulba Data 21 septembrie 2016 23:31:54
Problema Substr Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.57 kb
#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;
			if(x==val)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;
}