Cod sursa(job #1764989)

Utilizator GabiTulbaGabi Tulba-Lecu GabiTulba Data 26 septembrie 2016 10:15:08
Problema Substr Scor 100
Compilator cpp Status done
Runda cerculdeinfo-lectia1-hashuri.rabinkarp Marime 1.92 kb
#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;
}