Cod sursa(job #1519324)

Utilizator antanaAntonia Boca antana Data 7 noiembrie 2015 10:51:03
Problema Substr Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.83 kb
#include <iostream>
#include<cstdio>
#include<string.h>
#include<algorithm>
#define m1 1000007
//#define m2 1000007
using namespace std;
int n, k, a;
char s[17000];
int v[17000];
void hashing(int k)
{
    int i, p1=1,p2=1, nr1=0, nr2=0;
    for(i=0;i<k;i++)
    {
        nr1=((nr1*123)%m1+s[i])%m1;
        //nr2=((nr2*123)%m1+s[i])%m2;
        if(i>0){
        p1=(p1*123)%m1;
        //p2=(p2*123)%m2;
        }
    }
    v[++a]=nr1;
    //v[a].rest2=nr2;
    for(i=k;i<n;i++)
    {
        nr1=nr1-(s[i-k]*p1)%m1;
        if(nr1<0)
            nr1+=m1;
        nr1=((nr1*123)%m1+s[i])%m1;
        //nr2=nr2-(s[i-k]*p2)%m2;
        //if(nr2<0)
         //   nr2+=m2;
        //nr2=((nr2*123)%m2+s[i])%m2;
        v[++a]=nr1;
        //v[a].rest2=nr2;
    }
}
/*bool cresc(hashuri x, hashuri y){
    if(x.rest1<=y.rest1)
        return true;
    if(x.rest1==y.rest1)
        if(x.rest2<=y.rest2)
            return true;
    return false;
}*/
int main()
{
    freopen("substr.in", "r", stdin);
    freopen("substr.out", "w", stdout);
    int lmax=1, l1, l2, m, secvmax=0, nrap=0, secv=0,i;
    scanf("%d%d\n", &n, &k);
    gets(s);
    n=strlen(s);
    l1=1;
    l2=n;
    while(l1<=l2)
    {
        m=(l1+l2)/2;
        a=0;
        hashing(m);
        sort(v+1, v+a+1);
        secv=1;
        secvmax=1;
        for(i=2;i<=a;i++)
        {
            if(v[i-1]==v[i])
                secv++;
            else
            {
                if(secvmax<secv)
                    secvmax=secv;
                secv=1;
            }
        }
        if(secvmax<secv)
            secvmax=secv;
        if(secvmax>=k){
            if(m>lmax)
                lmax=m;
            l1=m+1;
        }
        if(secvmax<k)
            l2=m-1;
    }
    printf("%d", lmax);
    return 0;
}