Cod sursa(job #2681555)

Utilizator AndreiStanescuAlloys Nokito AndreiStanescu Data 5 decembrie 2020 19:34:30
Problema Substr Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.83 kb
#include<bits/stdc++.h>
using namespace std;
	
const int N = 16390;
const int M = 15;
string s;

int n,k;
int P[M][N],pas,logn,dim,pos[N];
	
struct duplu{
    int first,second,index;
    bool operator < (duplu other) const {
        return first == other.first ? second < other.second : first< other.first;
    }
}L[N];
	
void init()
{
    dim = n;
    for(int i=0;i<dim;++i)
        P[0][i] = (int)s[i];
}
	
void sufix_arrays()
{
    for(pas = 1, logn = 1; (pas>> 1) < dim; ++ logn, pas <<= 1)
    {
        for(int i=0;i<dim;++i)
        {
            L[i].first = P[logn - 1][i];
            if(i + pas < dim)
                L[i].second = P[logn-1][i+pas];
            else
                L[i].second = -1;
            L[i].index= i;
        }
        sort(L,L+dim);
        for(int i=0;i<dim;++i)
        {
            //normalizare
            P[logn][L[i].index] = i;
            //caz de egalitate
            if(L[i].first == L[i-1].first && L[i].second == L[i-1].second)
                P[logn][L[i].index] = P[logn][L[i-1].index];
                
        }
        //cerr<<P[logn][1]<<'\n';
    }
}
	
 
int lcp(int x, int y) {
    int sol = 0;
    if(x == y) 
        return dim - x;

    for(int k = logn - 1; k >= 0 && x < dim && y < dim; -- k) {
        if(P[k][x] == P[k][y]) {
            sol += (1 << k);
            x += (1 << k);
            y += (1 << k);
        }
    }
    return sol;
}
	
int main()
{
    freopen("substr.in", "r", stdin);
    freopen("substr.out", "w", stdout);
    cin>>n>>k;
    cin>>s;
    init();
    sufix_arrays();
    //for(int i=0;i<dim;++i)
    //    pos[P[logn][i]] = i;
    //cerr<<s[L[0].index]<<' '<<lcp(0,2);
    int ans=-1;
    for(int i=0;i<=n-k;++i)
        ans=max(ans,lcp(L[i].index,L[i+k-1].index));
    cout<<ans<<'\n';
}