Yet Another Sigma Problem

题目传送门

题目

跳转看吧

题解

哈希,字典树

对字符串的前缀进行哈希处理,转换为数字,用 \(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;
}

完结,撒花

posted @ 2024-07-05 15:36  什么时候才能不困  阅读(17)  评论(0)    收藏  举报
// /* */