Cod sursa(job #1150965)

Utilizator PatrikStepan Patrik Patrik Data 23 martie 2014 19:08:49
Problema Substr Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.68 kb
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    using namespace std;
    #define NMAX 17000
    int N ,K , P[17][NMAX] , best , k;
    char s[NMAX] ;
    struct lista
    {
        int nr[2] , p;
    }L[NMAX];


    bool f(lista A , lista B)
    {
        if(A.nr[0] == B.nr[0])return A.nr[1] < B.nr[1] ;
        return A.nr[0] < B.nr[0] ;
    }

    int prefix(int x , int y)
    {
        int rez = 0;
        for(int i = k , l = (1<<k) ; i >=0 && x <= N && y<= N ;i--, l>>=1)
            if(P[i][x] == P[i][y] && x+l -1 <= N && y+l-1 <= N )
        {
            x = x+l;
            y = y+l;
            rez +=l;
        }
        return rez;
    }

    int main()
    {
        freopen("substr.in" , "r" , stdin );
        freopen("substr.out" , "w" , stdout );
        scanf("%d%d\n" , &N , &K );
        scanf("%s" , s+1);
        for(int i = 1 ; i <= N ; ++i )
            P[0][i] = s[i]-'0';
        int l;
        for(k = 1 , l = 1 ; l>>1 <= N ; ++k , l <<=1 )
        {
            for(int i = 1 ; i <= N ; ++i )
            {
                L[i].nr[0] = P[k-1][i];
                if(i+l <= N)L[i].nr[1] = P[k-1][i+l];
                else L[i].nr[1] = -1;
                L[i].p = i;
            }
            sort(L+1,L+N+1,f);
            for(int i = 1 ; i<= N ; ++i )
                if(i > 1 && L[i].nr[0] == L[i-1].nr[0] && L[i].nr[1] == L[i-1].nr[1])
                    P[k][L[i].p] = P[k][L[i-1].p];
                else P[k][L[i].p] = i;
        }
        k--;
        for(int i = 1; i <= N-K+1 ; ++i )
            best  = max(best , prefix(L[i].p,L[i+K-1].p));
        printf("%d" , best);
        return 0;
    }