Cod sursa(job #1521136)

Utilizator ASTELOTudor Enescu ASTELO Data 9 noiembrie 2015 22:31:39
Problema Substr Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.81 kb
#include<cstdio>
#include<cstring>
#include<algorithm>
#define n1 100007
#define n2 100021
using namespace std;
char s[20001],c;
int cate,i;
int x=1,y=1,j,k,l,n,r1,r2,q,nr1,nr2,nrr1=0,nrr2=0,l1,l2,mid,o;
int main ()
{
freopen("substr.in","r",stdin);
freopen("substr.out","w",stdout);
scanf("%d%d%c",&n,&k,&c);
l1=1;
l2=n-k+1;
gets(s);
while(l1<=l2)
    {
    int pp=0;
    mid=(l1+l2)/2;
    for(int co=0;co<n-mid;co++)
        {
        x=1;
        cate=1;
        y=1;
        nr1=nr2=0;
        for(i=co;i<co+mid;i++)
            {
            q=s[i];
            nr1=((nr1*123)%n1+q)%n1;
            nr2=((nr2*123)%n2+q)%n2;
            if(i!=co)
                {
                x=(x*123)%n1;
                y=(y*123)%n2;
                }
            }
            nrr1=0,nrr2=0;
            for(i=co+1;i<co+mid+1;i++)
                {
                q=s[i];
                nrr1=nrr1*123+q;
                nrr2=nrr2*123+q;
                nrr1%=n1;
                nrr2%=n2;
                }
            if(nrr1==nr1&&nrr2==nr2)
                cate++;
            for(i=co+1;i<=n-mid-1;i++)
                {
                int x1,y1;
                x1=(x*s[i])%n1;
                y1=(y*s[i])%n2;
                nrr1-=x1;
                nrr2-=y1;
                if(nrr1<0)
                    nrr1+=n1;
                if(nrr2<0)
                    nrr2+=n2;
                q=s[i+mid];
                nrr1=(nrr1*123+q)%n1;
                nrr2=(nrr2*123+q)%n2;
                if(nrr1==nr1&&nrr2==nr2)
                    cate++;
            }
        if(cate>=k)
            {
            o=mid;
            pp=1;
            l1=mid+1;
            break;
            }
        }
    if(pp==0)
        l2=mid-1;
    }
printf("%d",o);
return 0;
}