Cod sursa(job #1412246)

Utilizator dobrebogdanDobre Bogdan Mihai dobrebogdan Data 1 aprilie 2015 10:50:47
Problema Substr Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.15 kb
#include<cstdio>
char si[17000];
const int md=1000003;
int fr[md+5];
int main()
{
    freopen("substr.in","r",stdin);
    freopen("substr.out","w",stdout);
    int n,k,i,j,mi,la,pu,tm,st,dr;
    bool te;
    scanf("%d%d\n",&n,&k);
    gets(si+1);
    for(i=1;i<=n;i++)
    if(si[i]>='a' && si[i]<='z')
    si[i]=si[i]-'a'+1;
    else
    if(si[i]>='A' && si[i]<='Z')
    {
        si[i]=si[i]-'A'+30;
    }
    else
    si[i]=si[i]-'0'+60;
    st=1;
    dr=n;
    la=0;
    while(st<=dr)
    {
        te=0;
        mi=(st+dr)/2;
        pu=1;
        for(i=1;i<mi;i++)
        pu=(pu*70)%md;
        tm=0;
        for(i=1;i<=mi;i++)
        tm=(tm*70+si[i])%md;
        fr[tm]++;
        for(i=mi+1;i<=n;i++)
        {
            tm=(tm-(pu*si[i-mi])%md)%md;
            if(tm<0)
            tm=tm+md;
            tm=(tm*70+si[i])%md;
            fr[tm]++;
        }
        for(i=0;i<md;i++)
        {
        if(fr[i]>=k)
            te=1;
        fr[i]=0;
        }
        if(te)
        {
            la=mi;
            st=mi+1;
        }
        else
        dr=mi-1;
    }
    printf("%d\n",la);
    return 0;
}