Cod sursa(job #2347601)

Utilizator Gl0WCula Stefan Gl0W Data 18 februarie 2019 21:51:49
Problema Substr Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.75 kb
#include <fstream>
#include <algorithm>

using namespace std;

ifstream fin ("substr.in");
ofstream fout ("substr.out");

pair < pair < int, int >, int > L[16400];
int p[20][16400], v[16400], sol, n, k, expn, lenght;
char s[16400];

int lcp(int i, int j){
    int f = expn;
    int power = (1 << expn);
    int sol = 0;
    while(power){
        if(p[f][i] == p[f][j]){
            sol += power;
            i += power;
            j += power;
        }
        f--;
        power /= 2;
    }
    return sol;
}

int main(){
    fin>>n>>k;
    if(k == 1){
        fout<<n;
    }
    else{
        fin>>s;
        for(int i = 0; s[i] != 0; i++){
            p[0][i] = s[i] - '0';
        }
        for(expn = 0, lenght = 1; lenght <= n; expn++, lenght *= 2){
            for(int i = 0; i < n; i++){
                L[i].first.first = p[expn][i];
                if(i + lenght < n){
                    L[i].first.second = p[expn][i + lenght];
                }
                else{
                    L[i].first.second = -1;
                }
                L[i].second = i;
            }
            sort(L, L + n);
            p[expn + 1][L[0].second] = 0;
            for(int i = 1; i < n; i++){
                if(L[i].first.first == L[i - 1].first.first && L[i].first.second == L[i - 1].first.second){
                    p[expn + 1][L[i].second] = p[expn + 1][L[i - 1].second];
                }
                else{
                    p[expn + 1][L[i].second] = p[expn + 1][L[i - 1].second] + 1;
                }
            }
        }
        for(int i = 0; i < n; i++){
            v[p[expn][i]] = i;
        }
        sol = 0;
        for(int i = 0; i + k - 1 < n; i++){
            sol = max(sol, lcp(v[i], v[i + k - 1]));
        }
        fout<<sol;
    }
    return 0;
}