题目大意:

两个字符串相似定义为:

1.两个字符串长度相等

2.两个字符串对应位置上有且仅有至多一个位置所对应的字符不相同

给定一个字符串,每次询问两个子串在给定的规则下是否相似。给定的规则指每次给出一些等价关系,如‘a'=’b',‘b'=’c'等,注意这里的等价关系具有传递性,即若‘a'=’b',‘b'=’c',则‘a'=’c'。

解题报告:

正解:哈希+二分

我们先处理出每一个字母哈希值的前缀和,然后并查集维护等价关系,对于相似的判断,如果两串的哈希值完全一样,就为YES,如果存在一个字符不一样,那么我们就二分那个位置,判断左右哈希值是否相等,如果两端哈希值都不相等,说明存在两个以上的位置不相同,判为NO

#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#define RG register
#define il inline
#define iter iterator
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
using namespace std;
typedef long long ll;
const int N=300005;
ll p=20021021,mod=1e9+7,ha[N][26],mul[N];
char S[N],sc[5];int n,a[N],fa[27];
int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
ll query(int l,int r){
ll ret=0,x;
for(int i=0;i<26;i++){
x=((ha[r][i]-(ha[l-1][i]*mul[r-l+1])%mod)+mod)%mod;
ret=(ret+x*(find(i)+1))%mod;
}
return ret;
}
void work()
{
scanf("%s",S+1);
n=strlen(S+1);
for(int i=1;i<=n;i++)a[i]=S[i]-'a';
mul[0]=1;for(int i=1;i<=n;i++)mul[i]=mul[i-1]*p%mod;
for(int i=1;i<=n;i++){
for(int j=0;j<26;j++)
ha[i][j]=ha[i-1][j]*p%mod;
(ha[i][a[i]]+=1)%=mod;
}
int Q,Ls,Rs,Lt,Rt,m,l,r,mid,Hl,Hr,Hll,Hrr,flag;
scanf("%d",&Q);
while(Q--){
scanf("%d%d%d%d%d",&m,&Ls,&Rs,&Lt,&Rt);
for(int i=0;i<26;i++)fa[i]=i;
for(int i=1;i<=m;i++){
scanf("%s",sc);
if(find(sc[0]-'a')!=find(sc[1]-'a'))
fa[find(sc[1]-'a')]=find(sc[0]-'a');
}
if(Rt-Lt!=Rs-Ls){puts("NO");continue;}
if(query(Lt,Rt)==query(Ls,Rs)){puts("YES");continue;}
l=1;r=Rt-Lt+1;flag=0;
while(l<=r){
mid=(l+r)>>1;
Hl=query(Ls,Ls+mid-1);Hr=query(Lt,Lt+mid-1);
Hll=query(Ls+mid,Rs);Hrr=query(Lt+mid,Rt);
if(Hl!=Hr && Hll!=Hrr){flag=1;break;}
if(Hl!=Hr)r=mid-1;
else l=mid+1;
}
if(flag)puts("NO");
else puts("YES");
}
} int main()
{
work();
return 0;
}

51Nod 1753 相似子串的更多相关文章

  1. 51nod 1286 三段子串(树状数组+拓展kmp)

    题意: 给定一个字符串S,找到另外一个字符串T,T既是S的前缀,也是S的后缀,并且在中间某个地方也出现一次,并且这三次出现不重合.求T最长的长度. 例如:S = "abababababa&q ...

  2. 51 NOD 1753 相似子串 字符串hash

      1735  相似子串  基准时间限制:5 秒 空间限制:131072 KB 分值: 80   两个字符串相似定义为:1.两个字符串长度相等2.两个字符串对应位置上有且仅有至多一个位置所对应的字符不 ...

  3. NOIP2018提高组金牌训练营——字符串专题

    NOIP2018提高组金牌训练营——字符串专题 1154 回文串划分 有一个字符串S,求S最少可以被划分为多少个回文串. 例如:abbaabaa,有多种划分方式.   a|bb|aabaa - 3 个 ...

  4. (最长回文子串 线性DP) 51nod 1088 最长回文子串

    输入一个字符串Str,输出Str里最长回文子串的长度. 回文串:指aba.abba.cccbccc.aaaa这种左右对称的字符串. 串的子串:一个串的子串指此(字符)串中连续的一部分字符构成的子(字符 ...

  5. 51Nod 算法马拉松28 B题 相似子串 哈希

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - 51Nod1753 题意概括 两个字符串相似定义为: 1.两个字符串长度相等 2.两个字符串对应位置上有且仅有 ...

  6. 51Nod 1089:最长回文子串 V2(Manacher算法)

    1089 最长回文子串 V2(Manacher算法)  基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 回文串是指aba.abba.cccbccc.aaa ...

  7. 51Nod 1088:最长回文子串(暴力)

    1088 最长回文子串  基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 回文串是指aba.abba.cccbccc.aaaa这种左右对称的字符串. 输入 ...

  8. 51nod 1089 最长回文子串 V2(Manacher算法)

    回文串是指aba.abba.cccbccc.aaaa这种左右对称的字符串. 输入一个字符串Str,输出Str里最长回文子串的长度. 收起   输入 输入Str(Str的长度 <= 100000) ...

  9. 51nod 1088 最长回文子串 【中心拓展法/输出长度和路径】

    1088 最长回文子串 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 回文串是指aba.abba.cccbccc.aaaa这种左右对称的字符串. 输入一个字 ...

随机推荐

  1. Linux进程间通信--信号量

    信号量绝对不同于信号,一定要分清,关于信号,上一篇博客中已经说过,如有疑问,请移驾! 信号量 一.是什么   信号量的本质是一种数据操作锁,它本身不具有数据交换的功能,而是通过控制其他的通信资源(文件 ...

  2. 第八条:覆盖equals时请遵守通用约定

    ==是物理相等 equals是逻辑相等 因为每个类的实例对象本质上都是唯一的 ,利用物理相等(==)是指一个实例只能相等于它自己. 利用逻辑相等是(equals)指 一个实例是否和另一个实例的某些关键 ...

  3. bzoj千题计划252:bzoj1095: [ZJOI2007]Hide 捉迷藏

    http://www.lydsy.com/JudgeOnline/problem.php?id=1095 点分树+堆 请去看 http://www.cnblogs.com/TheRoadToTheGo ...

  4. kali linux 2.0 web 渗透测试 电子书

    原创 2017-05-31 玄魂工作室 玄魂工作室 打起精神,重新开启订阅号的原创文章写作工作,但是需要点时间,请耐心等待. 求资料的同学,没有及时回复的,请再次留言,我会尽快处理.今天分享两本电子书 ...

  5. 租户、租户管理员、部门管理员和开发者在APIGW中的角色

    一.参与者 1.vdcId:租户 2.运营管理员 operator: 一种角色 创建开发商 审批外置服务,如:hadoop集群 审批内置服务,如:<API使用申请> 3.租户管理员     ...

  6. 阿里云API网关(14)流控策略

    网关指南: https://help.aliyun.com/document_detail/29487.html?spm=5176.doc48835.6.550.23Oqbl 网关控制台: https ...

  7. GIT入门笔记(5)- 创建版本库

    版本库又名仓库,英文名repository,可以简单理解成一个目录, 这个目录里面的所有文件都可以被Git管理起来,每个文件的修改.删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻 ...

  8. OAuth2.0学习(3-1)发布 spring-oauth-client 和 spring-oauth-server

    1.发布spring-oauth-server应用 1.1.创建案例数据库oauth2,root/Abc1234% 1.2.执行脚本,创建数据结构和demo数据 init_db.sql (user_用 ...

  9. 【第二十篇】C#微信H5支付 非微信内浏览器H5支付 浏览器微信支付

    微信开发者文档 微信H5支付官方文档   请阅读清楚  最起码把所有参数看一遍 这个地方也可以看看 微信案例 http://wxpay.wxutil.com/mch/pay/h5.v2.php,请在微 ...

  10. 安装shellinabox-master

    安装shellinabox-master 1 插件介绍:通过web页面管理linux主机(电脑版) a. 安装 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 ...