Cod sursa(job #1150946)

Utilizator PatrikStepan Patrik Patrik Data 23 martie 2014 18:53:15
Problema Substr Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.88 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(char A[] , char B[] , int x , int y)
    {
        int ls = 0 , ld = k , mid , rez = 0;
        while(ls <= ld)
        {
            mid = (ls+ld)/2;
            if(P[mid][x] == P[mid][y])
            {
                rez = 1<<mid;
                ls = mid+1;
            }
            else ld = mid-1;
        }
        int n = strlen(A);
        int 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';
        int l;
        for(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;
        }
        k--;
        for(int i = 1; i <= N-K+1 ; ++i )
            best  = max(best , prefix(s+L[i].p , s+L[i+K-1].p , L[i].p,L[i+K-1].p));
        printf("%d" , best);
        return 0;
    }