```cpp
#include <bits/stdc++.h>
//#define int long long
const int N = 5.1e5 + 5;
using namespace std;
#define writeln(x) write(x) , putchar(10)
#define writesp(x) write(x) , putchar(32)
inline int read(){
char ch = getchar();
int x = 0 , f = 0;
while(!isdigit(ch) ){
f |= (ch == '-');
ch = getchar();
}
while(isdigit(ch) ){
x = (x << 1) + (x << 3) + (ch ^ 48);
ch = getchar();
}
return (f ? -x : x);
}
inline void write(long long x){
if(x < 0)putchar('-') , x = -x;
if(x / 10)write(x / 10);
putchar(x % 10 ^ 48);
}
vector<int> G[N];
struct TRIE {
int t[N][27] , e[N] , cnt = 0;
void adds(char* a){
int len = strlen(a + 1) , lst = 0;
int p = 0;
for(int i = 1; i <= len; ++ i){
if(t[p][a[i] - 'a']){
p = t[p][a[i] - 'a'];
}
else {
++ cnt;
p = t[p][a[i] - 'a'] = cnt;
}
if(e[p]) lst = p;
}
// G.adde(lst + 1 , p + 1 , 1);
G[lst + 1].push_back(p + 1);
e[p] = 1;
}
}tr;
int n;
char a[N];
int son[N] , siz[N];
void dfs(int u , int fa){
siz[u] = 1;
for(int v : G[u]){
if(v == fa)continue;
++ son[u];
dfs(v , u);
siz[u] += siz[v];
}
}
bool cmp(int x , int y){
if(siz[x] > siz[y]){
swap(siz[x] , siz[y]);
return 0;
}
else {
return 1;
}
}
//void dfs2(int u , int fa){
// sort(G[u].begin() , G[u].end() , cmp);
// for(int v : G[u]){
// if(v == fa)continue;
// dfs2(v , u);
// }
//}
long long ans = 0;
void sol(int u , int fa , long long sum){
if(!G[u].empty())sort(G[u].begin() , G[u].end() , cmp);
int x = 1;
for(int v : G[u]){
if(v == fa)continue;
++ ans;
ans += sum + son[u] - x;
sol(v , u , sum + son[u] - x);
++ x;
}
}
signed main(){
n = read();
for(int i = 1; i <= n; ++ i){
cin >> (a + 1);
int len = strlen(a + 1);
reverse(a + 1 , a + 1 + len);
tr.adds(a);
}
dfs(1 , 0);
// return 0;
sol(1 , 0 , 0);
write(ans);
return 0;
}
```
by NightDiver @ 2024-02-21 16:54:14
可以确定是sol()函数的问题,因为在sol之前return 0是WA
by NightDiver @ 2024-02-21 16:58:15
没事了,cmp函数写了个傻逼操作,把它交换了
by NightDiver @ 2024-02-21 17:01:58