Nu aveti permisiuni pentru a descarca fisierul grader_test6.ok

Cod sursa(job #3124390)

Utilizator divadddDavid Curca divaddd Data 28 aprilie 2023 14:29:05
Problema Substr Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.02 kb
#include <bits/stdc++.h>
using namespace std;
const int NMAX = 16340;
const int LMAX = 16;
string str;
int n,k,p[NMAX][LMAX],lg,ord[NMAX];

struct element{
    pair<int, int> pos;
    int idx;
} v[NMAX];

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

int lcp(int x, int y){
    int k = 0, ans = 0;
    if(x == y){
        return n-x;
    }
    for(k = lg-1; k >= 0 && x < n && y < n; k--){
        if(p[x][k] == p[y][k]){
            x += (1<<k);
            y += (1<<k);
            ans += (1<<k);
        }
    }
    return ans;
}

int getval(char ch){
    return (ch-'0');
}

int main()
{
    fin >> n >> k;
    fin >> str;
    for(int i = 0; i < n; i++){
        p[i][0] = getval(str[i]);
    }
    for(int i = 1, pwr = 1; (pwr/2) < n; i++, pwr <<= 1, lg++){
        for(int j = 0; j < n; j++){
            v[j].pos.first = p[j][i-1];
            if(j+pwr < n){
                v[j].pos.second = p[j+pwr][i-1];
            }else{
                v[j].pos.second = -1;
            }
            v[j].idx = j;
        }
        sort(v, v+n, [&](element &a, element &b){
             if(a.pos.first < b.pos.first){
                return true;
             }else if(a.pos.first == b.pos.first){
                if(a.pos.second < b.pos.second){
                    return true;
                }
             }
             return false;
        });
        int lst = -1;
        int cnt = 0;
        for(int j = 0; j < n; j++){
            if(lst == -1){
                p[v[j].idx][i] = cnt++;
                lst = j;
            }else{
                if(v[lst].pos == v[j].pos){
                    p[v[j].idx][i] = cnt++;
                }else{
                    p[v[j].idx][i] = cnt;
                    lst = j;
                }
            }
        }
    }
    int ans = 0;
    for(int i = 0; i < n; i++){
        ord[p[i][lg]] = i;
    }
    for(int i = 0; i < n-k; i++){
        ans = max(ans, lcp(ord[i], ord[i+k-1]));
    }
    fout << ans;
    return 0;
}