Cod sursa(job #1150928)

Utilizator PatrikStepan Patrik Patrik Data 23 martie 2014 18:34:47
Problema Substr Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    using namespace std;
    #define NMAX 17000
    int N ,K , P[17][NMAX] , best;
    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(char A[] , char B[])
    {
        int rez = 0;
        int n = strlen(A) , m = strlen(B);
        while(rez < n && rez < m && A[rez] == B[rez] )rez++;
        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';
        for(int k = 1 , l = 1 ; 1<<k <= 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;
        }
        for(int i = 1; i <= N-K+1 ; ++i )
            best  = max(best , prefix(s+L[i].p,s+L[i+K-1].p));
        printf("%d" , best);
        return 0;
    }