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;
}

完结,撒花

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值