Cod sursa(job #1165449)

Utilizator Daniel3717Aleca Daniel Adrian Daniel3717 Data 2 aprilie 2014 18:18:54
Problema Substr Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.66 kb
#include <iostream>
#include <fstream>
#include <map>
using namespace std;
#define mod1 666013
#define mod2 666017
#define p 127
#define maxn 20005

long long vh1[maxn],vh2[maxn],vph1[maxn],vph2[maxn];

pair<int,int> valhash(int l,int r)
{
    if (l>r)
        return valhash(r,l);

    long long valh1,valh2;

    valh1=vh1[r]-vh1[l-1]*vph1[r-l+1];
    valh1=valh1%mod1;
    if (valh1<0)
        valh1=valh1+mod1;

    valh2=vh2[r]-vh2[l-1]*vph2[r-l+1];
    valh2=valh2%mod2;
    if (valh2<0)
        valh2=valh2+mod2;

    return make_pair(int(valh1),int(valh2));
}

int n,k;

bool verify(int l)
{
    if (l>n)
        return false;

    map <pair <int,int> , int > mymap;
    mymap.clear();

    pair <int,int> pr;
    int i;
    for (i=l-1;i<n;i++)
    {
        pr=valhash(i-(l-1),i);
        mymap[pr]++;
        if (mymap[pr]==k)
            return true;
    }
    return false;
}

char s[20002];
long long h1,h2,ph1,ph2,i;
int l,r,ans,mid;
int main(void)
{
    FILE * f;
    f=fopen("substr.in","r");
    ofstream g("substr.out");

    fscanf(f,"%d%d",&n,&k);
    fgets(s,10,f);
    fgets(s,20000,f);
    h1=h2=0;
    ph1=ph2=1;
    for (i=0;i<n;i++)
    {
        ph1=(ph1*p)%mod1;
        ph2=(ph2*p)%mod2;
        vph1[i+1]=ph1;
        vph2[i+1]=ph2;
        h1=(h1*p+s[i])%mod1;
        h2=(h2*p+s[i])%mod2;
        vh1[i]=h1;
        vh2[i]=h2;
    }

    ans=0;
    l=1;
    r=20000;
    while (l<=r)
    {
        mid=(l+r)/2;
        if (verify(mid))
        {
            ans=mid;
            l=mid+1;
        }
        else
            r=mid-1;
    }

    g<<ans;
    return 0;
}