Cod sursa(job #3124438)

Utilizator divadddDavid Curca divaddd Data 28 aprilie 2023 18:28:47
Problema Algoritmul lui Euclid extins Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.95 kb
#include <bits/stdc++.h>
using namespace std;
const int NMAX = 50300;
const int LMAX = 32;
string str;
int n,p[NMAX][LMAX],lg,ord[NMAX];

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

ifstream fin("ghicit.in");
ofstream fout("ghicit.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 main()
{
    getline(fin, str);
    n = str.size();
    for(int i = 0; i < n; i++){
        p[i][0] = (str[i]-'a');
    }
    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;
        for(int j = 0; j < n; j++){
            if(lst == -1){
                p[v[j].idx][i] = j;
                lst = j;
            }else{
                if(v[lst].pos == v[j].pos){
                    p[v[j].idx][i] = lst;
                }else{
                    p[v[j].idx][i] = j;
                    lst = j;
                }
            }
        }
    }
    for(int i = 0; i < n; i++){
        ord[p[i][lg]] = i;
    }
    int ans = n;
    for(int i = 0; i < n-1; i++){
        ans += (n-(i+1))-lcp(ord[i], ord[i+1]);
    }
    fout << ans;
    return 0;
}