题目链接

题意翻译

给你一个长度为 \(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=hash[r]-hash[l-1]*p^{r-l+1}
\]

考虑到\(hash[i]\)每次对\(p\)取模,进一步得到下面的式子:

\[hash=(hash[r]-hash[l-1]*p^{r-l+1}+p)mod 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,巧解)的更多相关文章

  1. CF985F Isomorphic Strings

    题目描述 You are given a string s s s of length n n n consisting of lowercase English letters. For two g ...

  2. Leetcode 205 Isomorphic Strings 字符串处理

    判断两个字符串是否同构 hs,ht就是每个字符出现的顺序 "egg" 与"add"的数字都是122 "foo"是122, 而"ba ...

  3. 【题解】 Codeforces Edu44 F.Isomorphic Strings (字符串Hash)

    题面戳我 Solution 我们按照每个字母出现的位置进行\(hash\),比如我们记录\(a\)的位置:我们就可以把位置表示为\(0101000111\)这种形式,然后进行字符串\(hash\) 每 ...

  4. [leetcode]205. Isomorphic Strings 同构字符串

    Given two strings s and t, determine if they are isomorphic. Two strings are isomorphic if the chara ...

  5. LeetCode 205. 同构字符串(Isomorphic Strings)

    205. 同构字符串 205. Isomorphic Strings

  6. 字符串hash+找模数——cf985F

    19260817比自然溢出都要好使 /* 把原串变成用26个01串表示,第i个串对应的字符是i 然后进行字符串hash,s和t双射的条件是26个串的hash值排序后一一相等 */ #include&l ...

  7. Codeforces 985 F - Isomorphic Strings

    F - Isomorphic Strings 思路:字符串hash 对于每一个字母单独hash 对于一段区间,求出每个字母的hash值,然后排序,如果能匹配上,就说明在这段区间存在字母间的一一映射 代 ...

  8. Educational Codeforces Round 44 (Rated for Div. 2) F - Isomorphic Strings

    F - Isomorphic Strings 题目大意:给你一个长度为n 由小写字母组成的字符串,有m个询问, 每个询问给你两个区间, 问你xi,yi能不能形成映射关系. 思路:这个题意好难懂啊... ...

  9. Java 字符串格式化详解

    Java 字符串格式化详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 文中如有纰漏,欢迎大家留言指出. 在 Java 的 String 类中,可以使用 format() 方法 ...

随机推荐

  1. 2018.2.25 关于JavaScript

    关于JavaScript 1.数组的归约函数reduce(function(PREV,CUR,I){})会从做导游进行迭代,每次返回的值为下一次的prev参数. 2.在循环遍历数组时若是想在找到结果后 ...

  2. python中yield的用法详解

    首先我要吐槽一下,看程序的过程中遇见了yield这个关键字,然后百度的时候,发现没有一个能简单的让我懂的,讲起来真TM的都是头头是道,什么参数,什么传递的,还口口声声说自己的教程是最简单的,最浅显易懂 ...

  3. Bootstrap 提示工具(Tooltip)插件方法的用法

    方法 下面是一些提示工具(Tooltip)插件中有用的方法: 方法 描述 实例 Options: .tooltip(options) 向元素集合附加提示工具句柄. $().tooltip(option ...

  4. 12_1_Annotation注解

    12_1_Annotation注解 1. 什么是注解 Annotation是从JDK5.0开始引入的新技术. Annotation的作用: 不是程序本身,可以对程序作出解释.可以被其他程序(比如,编译 ...

  5. skynet 学习笔记-sproto模块(2)

    云风在skynet中继承了sproto的传输协议,对比protobuf的好处是,能明文看到传输内容,而且skynet不需要protobuf这么功能,所以云风也建议在lua层使用sproto来作为sky ...

  6. 20180904 定时器setTimeout和setInterval回调问题

    引用: setTimeout和setInterval两者的区别 setTimeout和setInterval的优缺点 setTimeout和setInterval详解 两者的作用都是在定时多少毫秒后回 ...

  7. 【dp】P1982 小朋友的数字

    有趣的细节题目 题目描述 有 n 个小朋友排成一列.每个小朋友手上都有一个数字,这个数字可正可负.规定每个小朋友的特征值等于排在他前面(包括他本人)的小朋友中连续若干个(最少有一个)小朋友手上的数字之 ...

  8. 02 Django框架基础(APP的创建访问)

    一.创建项目 1.命令:django-admin startproject sitename 2.IDLE环境:本质上都是执行上述命令 常用命令: python manage.py runserver ...

  9. 阿里大鱼短信发送 FOR DT

    //增加了参数$action 来标志发送的是什么短信 注册短信 验证码短信 提示短信等 function send_sms($mobile, $message, $word = 0, $time = ...

  10. 《零基础入门学习Python》【第一版】视频课后答案第001讲

    测试题答案: 0. Python 是什么类型的语言? Python是脚本语言 脚本语言(Scripting language)是电脑编程语言,因此也能让开发者藉以编写出让电脑听命行事的程序.以简单的方 ...