Cod sursa(job #1147061)

Utilizator chiriacandrei25Chiriac Andrei chiriacandrei25 Data 19 martie 2014 15:49:44
Problema Substr Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.05 kb
#include <cstdio>
#include <tr1/unordered_map>
#define Nmax 17000
#define X 64534
#define P 666013

using namespace std;

int N,K;
char a[Nmax];
tr1::unordered_map <int,int> H;

inline bool Ok(int L)
{
    int v=0,aux=1,i,cnt=0;
    H.clear();
    for(i=1;i<L;++i)
        aux=(1LL*aux*X)%P;
    for(i=1;i<=L;++i)
        v=(1LL*v*X+a[i]-'0')%P;
    H[v]=1;
    for(i=L+1;i<=N;++i)
    {
        v=(1LL*((v-(1LL*(a[i-L]-'0')*aux)%P+P)%P)*X+a[i]-'0')%P;
        ++H[v];
    }
    tr1::unordered_map <int,int>::iterator it;
    for(it=H.begin();it!=H.end();++it)
        cnt=max(cnt,it->second);
    if(cnt>=K)
        return true;
    return false;
}

int main()
{
    int st,dr,mij,sol;
    freopen ("substr.in","r",stdin);
    freopen ("substr.out","w",stdout);
    scanf("%d%d%s", &N,&K,(a+1));
    st=1; dr=N;
    while(st<=dr)
    {
        mij=(st+dr)/2;
        if(Ok(mij))
        {
            sol=mij;
            st=mij+1;
        }
        else
            dr=mij-1;
    }
    printf("%d\n", sol);
    return 0;
}