是我的好队友告诉我可以用tire树,他真的太强了QAQ
很久之前学的都忘了,又看了一遍;跟邻接表一样用idx索引
意:给n个字符串,定义f(x,y)为x,y的共同前缀的长度,问:
思路:边建树边算,将索引序号放在cnt数组中,表示:相同索引对应的字符个数
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N = 3e5 + 10;
int cnt[N * 26], son[N][26];
string s[N];
int n;
void solve()
{
cin >> n;
int sum = 0, id = 0;
for (int i = 0; i < n; i++)
{
string t;
cin >> t;
int p = 0;
for (int j = 0; j < t.size(); j++)
{
int u = t[j] - 'a';
if (!son[p][u])son[p][u] = ++id;
p = son[p][u];
sum += cnt[p];
cnt[p]++;
}
}
cout << sum << endl;
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int _ = 1;
//cin >> _;
while (_--)solve();
}