Cod sursa(job #614095)

Utilizator Magnuscont cu nume gresit sau fals Magnus Data 5 octombrie 2011 17:34:48
Problema Substr Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.02 kb
#include <cstdio>
#include <cstring>

char ch[16387];
int h[300017],n,k;

inline int code(char x){if (x>='0'&&x<='1') return x-'0'+1;else if (x>='a'&&x<='z') return x-'a'+11;else return x-'A'+37;}

int hash(int x)
{
    int aux=0,aux2=1,i;
    memset(h,0,sizeof(h));
    for (i=1;i<x;++i)
        aux2=(aux2*67)%300017;
    for (i=1;i<=x;++i)
        aux=(aux*67+code(ch[i]))%300017;
    h[aux]=1;
    for (i=2;i<=n-x+1;++i)
    {
        aux=(aux-aux2*code(ch[i-1]))%300017;
        if (aux<0)
            aux+=300017;
        aux=(aux*67+code(ch[i+x-1]))%300017;
        ++h[aux];
    }
    for (i=0;i<300017;++i)
        if (k<=h[i])
            return 1;
    return 0;
}

int main()
{
    int step,i;
    freopen("substr.in","r",stdin);
    freopen("substr.out","w",stdout);
    scanf("%d %d\n",&n,&k);
    fgets(ch+1,sizeof(ch)-1,stdin);
    for (step=1;step<n;step<<=1);
    for (i=0;step;step>>=1)
        if (i+step<=n&&hash(i+step))
            i+=step;
    printf("%d\n",i);
    return 0;
}