Cod sursa(job #1519291)

Utilizator antanaAntonia Boca antana Data 7 noiembrie 2015 09:26:53
Problema Substr Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.79 kb
#include <iostream>
#include<cstdio>
#include<string.h>
#include<algorithm>
#define m1 16387
#define m2 1000007
using namespace std;
int n, k, a;
char s[17000];
struct hashuri{ int rest1, rest2;};
hashuri 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)+s[i])%m1;
        nr2=((nr2*123)+s[i])%m2;
        if(i>0){
        p1*=123;
        p2*=123;
        }
        p1%=m1;
        p2%=m2;
    }
    v[++a].rest1=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+s[i])%m1;
        nr2=(nr2-(s[i-k]*p2))%m2;
        if(nr2<0)
            nr2+=m2;
        nr2=(nr2*123+s[i])%m2;
        v[++a].rest1=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);
    l1=1;
    l2=n;
    while(l1<=l2)
    {
        m=(l1+l2)/2;
        a=0;
        hashing(m);
        sort(v+1, v+a+1, cresc);
        secv=1;
        for(i=2;i<=a;i++)
        {
            if(v[i-1].rest1==v[i].rest1&&v[i-1].rest2==v[i].rest2)
                secv++;
            else
            {
                if(secvmax<secv)
                    secvmax=secv;
                secv=1;
            }
        }
        if(secvmax>=k){
            lmax=m;
            l1=m+1;
        }
        if(secvmax<k)
            l2=m-1;
    }
    printf("%d", lmax);
    return 0;
}