4503 企鹅QQ

这篇博客探讨了一种利用进制哈希解决字符串相似性问题的方法。作者通过计算字符串的区间哈希值并进行排序,找到两两之间相同位置的不同字符数量,从而求得相似字符串的数量。博客中提到了输入字符处理、字符串小常识以及代码实现,强调了哈希方法相对于线段树等数据结构的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

4503 企鹅QQ

QQ给了你ccf多少钱,我微信给你双倍(逃
记得前几天在夏令营的时候还是一个绿题,这就升蓝题了?
提炼题目
当以两个字符串,当且仅当|a|=|b|并且恰好只有一位是不同的,这样叫做两个字符串相似
现在给问给定n个长度为l的字符串,问两两之间有多少相似的字符串
emmmmm
我这个菜鸡不会啊
不过感觉hash还是比线段树树状数组这些东西好的,真的,最起码有点思路了
在这里补充一个字符串小常识,用cin输入字符的时候会自动过滤空格,用scanf会包括在里面,zp老师之前就告诉我们
还有就是打代码的时候需要必要的时候加上空格,好看
这里使用进制hash来计算

#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ll;
const int base=2333;
const int  SIZE=30005;
int n,l,s;
char c;
ll hash[SIZE][205],power[205];
ll t[SIZE];
 int main()
 {
 	cin>>n>>l>>s;
 	for(int i=1;i<=n;i++)
 	{
 		for(int j=1;j<=l;j++)
 		{
 			cin>>c;
 			hash[i][j]=hash[i][j-1]*base+c;//进制 
		 }
	 }
	power[0]=1;
	for(int i=1;i<=l;i++)
	{
		power[i]=power[i-1]*base;
	}
	int ans=0;
	for(int i=1;i<=l;i++)
	{
		for(int j=1;j<=n;j++)
		{
			t[j]=hash[j][l]-(hash[j][i]-hash[j][i-1]*base)*power[l-i]-hash[j][i-1]*(power[l-i+1]-power[l-i]);
		}//计算区间hash值 
		sort(t+1,t+n+1);
		int temp=1;
		for(int j=1;j<n;j++)
		{
			if(t[j]!=t[j+1]) temp=1;
			else ans+=temp++;
		}
	}
	cout<<ans<<endl;
 	return 0;
 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值