Cod sursa(job #1764820)

Utilizator BarbumateiBarbu Matei Barbumatei Data 25 septembrie 2016 22:08:25
Problema Substr Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <stdio.h>
#define B 211
#define MOD2 9478671
#define MOD1 665019
#define MAXN 16384
int q, ans, n, lista[MOD1], next[MAXN+1], val[MAXN+1], fr[MAXN+1], cine[MAXN+1];
char s[MAXN+1];
inline void adauga(int x, int y){
    int p=lista[x];
    while(p){
        if(val[p]==y){
            fr[p]++;
            if(fr[p]>ans){
                ans=fr[p];
            }
            return ;
        }
        p=next[p];
    }
    q++;
    val[q]=y;
    cine[q]=x;
    fr[q]=1;
    next[q]=lista[x];
    lista[x]=q;
}
inline int apar(int l){
    int a=0, b=0, ha=1, hb=1, i;
    q=0;
    ans=1;
    for(i=0; i<l-1; i++){
        a=(a*B+s[i])%MOD1;
        b=(b*B+s[i])%MOD2;
        ha=(ha*B)%MOD1;
        hb=(hb*B)%MOD2;
    }
    for(i=l-1; i<n; i++){
        a=(a*B+s[i])%MOD1;
        b=(b*B+s[i])%MOD2;
        adauga(a, b);
        a=(a-(ha*s[i-l+1])%MOD1+MOD1)%MOD1;
        b=(b-(hb*s[i-l+1])%MOD2+MOD2)%MOD2;
    }
    for(i=1; i<=q; i++){
        lista[cine[i]]=0;
    }
    return ans;
}
int main(){
    int k, i, rez, pas;
    FILE *fin, *fout;
    fin=fopen("substr.in", "r");
    fout=fopen("substr.out", "w");
    fscanf(fin, "%d%d ", &n, &k);
    for(i=0; i<n; i++){
        s[i]=fgetc(fin);
    }
    rez=0;
    for(pas=1<<16; pas; pas>>=1){
        if((rez+pas<=n)&&(apar(rez+pas)>=k)){
            rez+=pas;
        }
    }
    fprintf(fout, "%d\n", rez);
    fclose(fin);
    fclose(fout);
    return 0;
}