Cod sursa(job #1412337)

Utilizator dobrebogdanDobre Bogdan Mihai dobrebogdan Data 1 aprilie 2015 11:28:25
Problema Substr Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 kb
#include<cstdio>
char si[17000];
const int md=15000007;
short int fr[md+5],cs[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*80)%md;
        tm=0;
        for(i=1;i<=mi;i++)
        tm=(tm*80+si[i])%md;
           if(cs[tm]!=mi)
            {
                cs[tm]=mi;
                fr[tm]=0;
            }
        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*80+si[i])%md;
            if(cs[tm]!=mi)
            {
                cs[tm]=mi;
                fr[tm]=0;
            }
            fr[tm]++;
            if(fr[tm]>=k)
            te=1;
        }
        if(te)
        {
            la=mi;
            st=mi+1;
        }
        else
        dr=mi-1;
    }
    printf("%d\n",la);
    return 0;
}