Pagini recente » Cod sursa (job #1027791) | Cod sursa (job #1919620) | Cod sursa (job #715261) | Cod sursa (job #2343019) | Cod sursa (job #3124438)
#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;
}