Cod sursa(job #355085)

Utilizator CezarMocanCezar Mocan CezarMocan Data 10 octombrie 2009 10:29:56
Problema Substr Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.63 kb
#include <cstdio>
#include <iostream>
#include <cstring>

using namespace std;

long n,k,m,l,r,v[666013],x[9901],rez,b=73,mod=666013,mod1=9901, b1=67,i;
char C[16390],mn;

bool posibil(long m)
    {
    memset(v,0,sizeof(v));
    memset(x,0,sizeof(x));
    long i,j,v1,v2,t1,t2,max1,max2;    
    t1=t2=1;
    for (i=1;i<=m-1;i++)
        {
        t1=t1*b%mod;
        t2=t2*b1%mod1;
        }
    v1=0;v2=0;
    for (i=1;i<=m;i++)
        {
        v1=(v1*b+(C[i]))%mod;
        v2=(v2*b1+(C[i]))%mod1;
        }
    v[v1]++;
    x[v2]++;
    for (i=m+1;i<=n;++i)
        {
        v1=v1-(t1*(C[i-m])%mod);
        if (v1<0)
            v1+=mod;
        v2=v2-(t2*(C[i-m])%mod1);
        if (v2<0)
            v2+=mod1;
        v1=(v1*b+(C[i]))%mod;
        v2=(v2*b1+(C[i]))%mod1;
        v[v1]++;
        x[v2]++;
        }
    max1=max2=0;
    for (i=0;i<=mod;i++)
        if (v[i]>max1)
            max1=v[i];
    for (i=0;i<=mod1;i++)
        if (x[i]>max2)
            max2=x[i];
    if (max1>max2)
        max1=max2;
    if (max1>=k)
        return true;
    else
        return false;    
    }

int main(){
freopen("substr.in","r",stdin);
freopen("substr.out","w",stdout);
scanf("%d%d",&n,&k);
cin>>C+1;
/*for (i=0;i<strlen(C);i++)
    {
/*    if (C[i]>='0')
        mn+=40;
    if (C[i]>='A')
        mn+=50;
    if (C[i]>='a')
        mn+=6;
    C[i]-=40;
    }*/
l=1;
r=n;
while (l<=r)
    {
    m=(l+r)/2;
    if (posibil(m))
        {
        rez=m;    
        l=m+1;
//        printf("%d\n",m);
        }
    else
        r=m-1;
    }
printf("%d\n",rez);
return 0;
}