Cod sursa(job #2185656)

Utilizator tifui.alexandruTifui Ioan Alexandru tifui.alexandru Data 24 martie 2018 18:53:45
Problema Substr Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.51 kb
#include <bits/stdc++.h>
#define Nmax 16390
#define base1 27
#define base2 5
#define base3 7
#define MOD1 100007
#define MOD2 100021
#define MOD3 666013
using namespace std;
ifstream f("substr.in");
ofstream g("substr.out");
char s[Nmax];
int H1[MOD1+5];
int H2[MOD2+5];
int H3[MOD3+5];
int n,k,hash1,hash2,hash3,p1,p2,p3;
bool is_good(int len)
{
    memset(H1,0,sizeof(H1));
    memset(H2,0,sizeof(H2));
    memset(H3,0,sizeof(H3));
    hash1=hash2=hash3=0;
    p1=p2=p3=1;
    int i;
    for(i=1;i<=len;i++)
    {
        hash1=(hash1*base1+s[i])%MOD1;
        hash2=(hash2*base2+s[i])%MOD2;
        hash3=(hash3*base3+s[i])%MOD3;
        if(i>1)
        {
            p1=(p1*base1)%MOD1;
            p2=(p2*base2)%MOD2;
            p3=(p3*base3)%MOD3;
        }
    }
    ++H1[hash1];
    ++H2[hash2];
    ++H3[hash3];
    for(i=len+1;i<=n;i++)
    {
        hash1=((hash1-(p1*s[i-len])%MOD1+MOD1)*base1+s[i])%MOD1;
        hash2=((hash2-(p2*s[i-len])%MOD2+MOD2)*base2+s[i])%MOD2;
        hash3=((hash3-(p3*s[i-len])%MOD3+MOD3)*base3+s[i])%MOD3;
        ++H1[hash1];
        ++H2[hash2];
        ++H3[hash3];
        if(H1[hash1]>=k and H2[hash2]>=k and H3[hash3]>=k) return true;
    }
    return false;
}
int main()
{
    f>>n>>k;
    f>>(s+1);
    int lo=1,hi=n,mid,ans=1;
    while(lo<=hi)
    {
        mid=(lo+hi)>>1;
        if(is_good(mid))
        {
            ans=mid;
            lo=mid+1;
        }
        else hi=mid-1;
    }
    g<<ans;

    return 0;
}