CF985F Isomorphic Strings (字符串Hash,巧解)
题目链接
题意翻译
给你一个长度为 \(n\) 的字符串,\(m\) 次询问.
问两个相同长度的子串是否匹配.
我们称两个子串是匹配的,当且仅当其满足:
其中一个子串的字母可替代另一个子串的字母
例如,我们称 \(orzzz\) 和 \(yzkkk\) 是匹配的,因为其满足交换条件:
\(o\) -> \(y\)
\(r\) -> \(z\)
\(z\) -> \(k\)
所以它们是匹配的.
同时输入中前两个为子串起点,最后一个为子串长度.
Solution
先补充一个知识点,子串哈希的性质:
若已知一个\(|S|=n\)的字符串的 \(hash\) 值, \(hash[i],1≤i≤n,\) 其子串 \(sl..sr,1≤l≤r≤n\) ; 其中 \(hash[i]\) 代表其从开始到第 \(i\) 位的 \(hash\) 值
对应的hash值为:
\]
考虑到\(hash[i]\)每次对\(p\)取模,进一步得到下面的式子:
\]
至此得到求子串 \(hash\) 值公式.
然后看**这道题的做法:**
我们先将所有相同的字母单独拎出来组成一个新的字符串,其余字符的位置补成$0$.
给一个例子:
\(aaaba\) 和 \(cccdc\)
对于第一个子串:
\(a:11101\)
\(b:00010\)
第二个子串:
\(c:11101\)
\(d:00010\)
然后我们发现\(a\)与\(c\)的\(Hash\)值是相同的。
\(b\)和\(d\)也是相同的,然后就匹配成功。
然后在每次询问将子串里诸如此类的\(Hash\)值求出来。
排一遍序,然后\(O(26)\)找相同的即可,总体时间复杂度\(O(n*26*log26).\)
### Code
```cpp
#include
#define ll long long
using namespace std;
const int maxn=200008;
const ll seed=23;
const ll mod=19260817;
string ch;
int n,m;
ll hash[maxn][30];
ll cf[maxn];
ll a[30],b[30];
void pre()
{
for(int j=1;j<=26;j++)
for(int i=1;i<=n;i++)
{
ll fuck=0;
if(ch[i]=='a'+j-1)fuck='#';
hash[i][j]=((hash[i-1][j]seed)%mod+fuck)%mod;
}
cf[0]=1;
for(int i=1;i<=n;i++)
cf[i]=(cf[i-1]seed)%mod;
return;
}
void solve(int len,int s,int k)
{
for(int i=1;i<=26;i++)
{
a[i]=(hash[s+len-1][i]-(hash[s-1][i]cf[len]%mod)+mod)%mod;
b[i]=(hash[k+len-1][i]-(hash[k-1][i]cf[len]%mod)+mod)%mod;
}
sort(a+1,a+27);sort(b+1,b+27);
for(int i=1;i<=26;i++)
if(a[i]!=b[i]){cout<<"NO"<<endl;return;}
cout<<"YES"<<endl;
}
int main()
{
ch='*';
cin>>n>>m;
string s; cin>>s;
ch+=s;
pre();
for(int i=1;i<=m;i++)
{
int len,s,k;
scanf("%d%d%d",&s,&k,&len);
solve(len,s,k);
}
}
CF985F Isomorphic Strings (字符串Hash,巧解)的更多相关文章
- CF985F Isomorphic Strings
题目描述 You are given a string s s s of length n n n consisting of lowercase English letters. For two g ...
- Leetcode 205 Isomorphic Strings 字符串处理
判断两个字符串是否同构 hs,ht就是每个字符出现的顺序 "egg" 与"add"的数字都是122 "foo"是122, 而"ba ...
- 【题解】 Codeforces Edu44 F.Isomorphic Strings (字符串Hash)
题面戳我 Solution 我们按照每个字母出现的位置进行\(hash\),比如我们记录\(a\)的位置:我们就可以把位置表示为\(0101000111\)这种形式,然后进行字符串\(hash\) 每 ...
- [leetcode]205. Isomorphic Strings 同构字符串
Given two strings s and t, determine if they are isomorphic. Two strings are isomorphic if the chara ...
- LeetCode 205. 同构字符串(Isomorphic Strings)
205. 同构字符串 205. Isomorphic Strings
- 字符串hash+找模数——cf985F
19260817比自然溢出都要好使 /* 把原串变成用26个01串表示,第i个串对应的字符是i 然后进行字符串hash,s和t双射的条件是26个串的hash值排序后一一相等 */ #include&l ...
- Codeforces 985 F - Isomorphic Strings
F - Isomorphic Strings 思路:字符串hash 对于每一个字母单独hash 对于一段区间,求出每个字母的hash值,然后排序,如果能匹配上,就说明在这段区间存在字母间的一一映射 代 ...
- Educational Codeforces Round 44 (Rated for Div. 2) F - Isomorphic Strings
F - Isomorphic Strings 题目大意:给你一个长度为n 由小写字母组成的字符串,有m个询问, 每个询问给你两个区间, 问你xi,yi能不能形成映射关系. 思路:这个题意好难懂啊... ...
- Java 字符串格式化详解
Java 字符串格式化详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 文中如有纰漏,欢迎大家留言指出. 在 Java 的 String 类中,可以使用 format() 方法 ...
随机推荐
- 2019全套Java视频 免费赠送
本人今年刚看完这套课程找到工作了 待遇还不错 现在送给大家 网盘链接:https://pan.baidu.com/s/1cEK6WoXS4F9SRgj1bZclqg提取码:bjl8希望对大家有用 一起 ...
- ubuntu k8s 命令补全
apt install bash-completion // locate bash_completion source /usr/share/bash-completion/bash_complet ...
- 在线聊天项目1.4版 使用Gson方法解析Json字符串以便重构request和response的各种请求和响应 解决聊天不畅问题 Gson包下载地址
在线聊天项目结构图: 多用户登陆效果图: 多用户聊天效果图: 数据库效果图: 重新构建了Server类,使用了Gson方法,通过解析Json字符串,增加Info类,简化判断过程. Server类代码如 ...
- release判断系统
#!/bin/bash # Name: Atomic Archive configuration script # Copyright Atomicorp, 2002-2018 # License: ...
- python入门:py2.x里面除法或乘法这么写就可以计算小数点后面结果
#!/usr/bin/env python # -*- coding:utf-8 -*- #py2.x里面除法或乘法这么写就可以计算小数点后面结果,更精确future(未来,译音:非忧车) divis ...
- 使用GD库做图片水印
png图片作为水印加到其他类型图片后,背景变黑色 原因: imagecopy函数拷贝时可以保留png图像的原透明信息,而imagecopymerge却不支持图片的本身的透明拷贝. 然后直接上代码: / ...
- oracle如何保证读一致性 第二弹
Oracle之数据库一致性读的原理 在Oracle数据库中,undo主要有三大作用:提供一致性读(Consistent Read).回滚事务(Rollback Transaction)以及实例恢复(I ...
- LeetCode(120) Triangle
题目 Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjacen ...
- NordicSemiconductor.nRF_DeviceFamilyPack 更新历史记录
Version: 8.17.0 (2018-04-27) NordicSemiconductor.nRF_DeviceFamilyPack.8.17.0.packDownload For nRF528 ...
- selenium2-框架思想介绍
为什么要有框架? 可维护性 提高编写脚本效率 提高脚本的可读性 框架的几大要素: 1. driver管理 2. 脚本 3. 数据 4. 元素对象 5. Log 6. 报告 7. 运行机制 8. 失败用 ...