题目
跳转看吧
题解
哈希,字典树
对字符串的前缀进行哈希处理,转换为数字,用 \(map\) ,然后为了避免重复,可以将每一种公共字符串前缀的权重都设置为1
例如:
\(a\) , \(ab\) , \(aba\) 权重都为1,因为 \(ab\) 是2,但是有一种包含在 \(a\) 里面,同理, &aba& 是3,但是被 &ab& , &a& 包含,所以每个公共的前缀权重为1;
代码如下:
点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int base = 131;
int mod[] = { 1000000007, 998244353 };
map<pair<int, int>,int>H;
int main()
{
int n;
cin >> n;
ll ans = 0;
for (int i = 0; i < n; i++)
{
string s;
cin >> s;
ll hs[] = { 0,0 };//
for (int j = 0; j < s.length(); j++)
{
hs[0] = (hs[0] * base % mod[0] + s[j]) % mod[0];
hs[1] = (hs[1] * base % mod[1] + s[j]) % mod[1];
ans += H[make_pair(hs[0], hs[1])];
H[make_pair(hs[0], hs[1])]++;
}
}
cout << ans << endl;
}
完结,撒花
标签:ab,int,hs,ll,base,Problem,Sigma,Yet,mod From: https://www.cnblogs.com/haggard/p/18285964