Cod sursa(job #1587836)

Utilizator badea_adi1999Badea Adrian Catalin badea_adi1999 Data 2 februarie 2016 17:05:11
Problema Substr Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.94 kb
#include <cstdio>
#include <cstring>
#include <algorithm>
#define nmax 17000
#define teta 'z'-'0'+1
using namespace std;
int n,k,p,pmax,sol;
char s[nmax];
const int mod[3]={666011,666013,100007};
struct hashing{int h[3];} v[nmax],r;

int sorthashing(const hashing &a,const hashing &b)
{
    for (int i=0;i<3;i++)
        if (a.h[i]!=b.h[i])
            return a.h[i]<b.h[i];
    return 0;
}
int same(const hashing &a,const hashing &b)
{
    for (int i=0;i<3;i++)
        if (a.h[i]!=b.h[i])
            return 0;
    return 1;
}
int main()
{
    int i,j;
    freopen("substr.in","r",stdin);
    freopen("substr.out","w",stdout);
    scanf("%d %d\n%s\n",&n,&k,&s);
    int mijl,sol=0,st=0,dr=n;
    while (st<=dr) {
        mijl=(st+dr)>>1;
        memset(v,0,sizeof(v));

        for (j=0;j<3;j++)
            r.h[j]=1;
        for (i=1;i<mijl;i++)
            for (j=0;j<3;j++) {
                r.h[j]*=teta;
                r.h[j]=(r.h[j]+mod[j])%mod[j];
            }
        for (i=0;i<mijl;i++)
            for (j=0;j<3;j++) {
                v[mijl-1].h[j]*=teta;
                v[mijl-1].h[j]+=s[i]-'0';
                v[mijl-1].h[j]%=mod[j];
            }

        for (i=mijl;i<n;i++) {
            v[i]=v[i-1];
            for (j=0;j<3;j++) {
                v[i].h[j]-=1LL*(s[i-mijl]-'0')*r.h[j]%mod[j];
                v[i].h[j]+=mod[j];
                v[i].h[j]*=teta;
                v[i].h[j]+=s[i]-'0';
                v[i].h[j]%=mod[j];
            }
        }
        sort(v+mijl-1,v+n,sorthashing);
        p=pmax=1;
        for (i=mijl;i<n;i++) {
            if (same(v[i-1],v[i])) {
                p++;
                if (p>pmax)
                    pmax=p;
            }
            else
                p=1;
        }
        if (pmax>=k) {
            sol=mijl;
            st=mijl+1;
        }
        else
            dr=mijl-1;
    }
    printf("%d",sol);
    return 0;
}