Cod sursa(job #1768475)

Utilizator tiberiu.bucur17Tiberiu Constantin Emanoil Bucur tiberiu.bucur17 Data 30 septembrie 2016 21:55:28
Problema Substr Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.49 kb
#include <stdio.h>
#define MOD1 666019
#define MOD2 9478671
#define B 123
#define MAX_N 16384
FILE *fin,*fout;
char v[MAX_N+1];
int hash[MOD1],val[MAX_N+1],val2[MAX_N+1],next[MAX_N+1],frecv[MAX_N+1],m,max,n,k;
void Read()
{
    int i;
    fscanf(fin,"%d%d",&n,&k);
    fgetc(fin);
    for(i=0;i<n;i++)
        v[i]=fgetc(fin);
}
inline void add(int x,int y)
{
    int p=hash[x];
    while(p)
    {
        if(val[p]==y)
        {
            frecv[p]++;
            if(frecv[p]>max)
                max=frecv[p];
            return;
        }
        p=next[p];
    }
    val[++m]=y;
    val2[m]=x;
    frecv[m]=1;
    next[m]=hash[x];
    hash[x]=m;
}
inline int verif(int l)
{
    int a,b,ha,hb,i;
    m=a=b=0;ha=hb=max=1;
    for(i=0;i<l-1;i++)
    {
        a=(a*B+v[i])%MOD1;
        b=(b*B+v[i])%MOD2;
        ha=(ha*B)%MOD1;
        hb=(hb*B)%MOD2;
    }
    for(i=l-1;i<n;i++)
    {
        a=(a*B+v[i])%MOD1;
        b=(b*B+v[i])%MOD2;
        add(a,b);
        a=(a-(ha*v[i-l+1])%MOD1+MOD1)%MOD1;
        b=(b-(hb*v[i-l+1])%MOD2+MOD2)%MOD2;
    }
    for(i=1;i<=m;i++)
        hash[val2[i]]=0;
    return max;
}
int cbin()
{
    int pas,rez;
    rez=0;
    for(pas=1<<14;pas;pas>>=1)
        if(rez+pas<=n && verif(rez+pas)>=k)
            rez+=pas;
    return rez;
}
int main()
{
    fin=fopen("substr.in","r");
    fout=fopen("substr.out","w");
    Read();
    fprintf(fout,"%d",cbin());
    fclose(fin);
    fclose(fout);
    return 0;
}