Cod sursa(job #1147037)

Utilizator chiriacandrei25Chiriac Andrei chiriacandrei25 Data 19 martie 2014 15:34:52
Problema Substr Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.59 kb
#include <cstdio>
#include <vector>
#define Nmax 17000
#define P (1<<15)
#define X 6453432

using namespace std;

int N,K;
char a[Nmax];

struct coord
{
    int val,pas;
};
vector <coord> H[P+10];

inline void AdaugaHash(coord x)
{
    int i=(x.val&(P-1));
    H[i].push_back(x);
}

inline int CautaHash(int x, int L)
{
    int i=(x&(P-1)),cnt=0,len,j;
    len=H[i].size();
    for(j=0;j<len;++j)
        if(H[i][j].val==x && H[i][j].pas==L)
            ++cnt;
    return cnt;
}

inline bool Ok(int L)
{
    int v=0,aux=1,i;
    coord w;
    for(i=1;i<L;++i)
        aux=((1LL*aux*X)&(P-1));
    for(i=1;i<=L;++i)
        v=((1LL*v*X+a[i]-'0')&(P-1));
    w.val=v; w.pas=L;
    AdaugaHash(w);
    for(i=L+1;i<=N;++i)
    {
        v=(((1LL*((v-(1LL*(a[i-L]-'0')*aux)&(P-1))+P)&(P-1))*X+a[i]-'0')&(P-1));
        w.val=v; w.pas=L;
        AdaugaHash(w);
    }
    v=0;
    for(i=1;i<=L;++i)
        v=((1LL*v*X+a[i]-'0')&(P-1));
    if(CautaHash(v,L)>=K)
        return true;
    for(i=L+1;i<=N;++i)
    {
        v=(((1LL*((v-(1LL*(a[i-L]-'0')*aux)&(P-1))+P)&(P-1))*X+a[i]-'0')&(P-1));
        if(CautaHash(v,L)>=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;
}