51 NOD 1753 相似子串 字符串hash
1.两个字符串长度相等
2.两个字符串对应位置上有且仅有至多一个位置所对应的字符不相同
给定一个字符串,每次询问两个子串在给定的规则下是否相似。给定的规则指每次给出一些等价关系,如‘a'=’b',‘b'=’c'等,注意这里的等价关系具有传递性,即若‘a'=’b',‘b'=’c',则‘a'=’c'。
第一行一个字符串s(1<=|s|<=300000)
第二行一个整数T(1<=T<=300000)
对于每次询问:
第一行5个整数k,l1,r1,l2,r2,表示有k个等价规则,询问的是子串[l1,r1],[l2,r2](1<=k<=10,1<=l1<=r1<=|s|,1<=l2<=r2<=|s|)
接下来k行每行两个连续的字符表示这两个字符等价。
此题中所有的字符均为小写字母。
T行,若相似则输出“YES”否则输出“NO”
abac
3
1 1 2 3 4
bc
1 1 2 3 4
ac
1 1 2 2 3
ac
YES
YES
NO
#include <bits/stdc++.h>
inline long long read(){long long x=,f=;char ch=getchar();while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}return x*f;}
using namespace std;
typedef unsigned long long ULL; const int N = 4e5+;
const ULL mod = 10000019ULL; ULL sqr[N], tmp = , pre[N][], fi[], se[];
map<ULL, int> mp;
char s[N], ch[];
int T, fa[], vis[], F[];
int finds(int x) {return fa[x] == x? x:fa[x]=finds(fa[x]);}
int main() {
scanf("%s%d",s+,&T);
int n = strlen(s+);
sqr[] = ;
for(int i = ; i <= n; ++i) sqr[i] = sqr[i-] * mod, mp[sqr[i]] = ,mp[(-sqr[i])] = ;
for(int i = ; i <= n; ++i) {
tmp = tmp * mod;
pre[i][s[i] - 'a' + ] += tmp;
}
for(int i = ; i <= n; ++i) {
for(int j = ; j <= ; ++j) pre[i][j] += pre[i-][j];
}
for(int t = ; t <= T; t++) {
int k,l1,r1,l2,r2,cnt = ;
scanf("%d%d%d%d%d",&k,&l1,&r1,&l2,&r2);
for(int i = ; i <= ; ++i) fa[i] = i,vis[i] = ;
for(int i = ; i <= ; ++i) fi[i] = pre[r1][i] - pre[l1-][i];
for(int i = ; i <= ; ++i) se[i] = pre[r2][i] - pre[l2-][i];
for(int i = ; i <= k; ++i) {
scanf("%s",ch);
int fx = finds(ch[] - 'a' + );
int fy = finds(ch[] - 'a' + );
if(fx > fy) swap(fx,fy);
if(fx != fy)
fa[fy] = fx,fi[fx] += fi[fy],se[fx] += se[fy],fi[fy] = ,se[fy] = ;
}
if(r1 - l1 != r2 - l2) {
printf("NO\n");
continue;
}
for(int i = ; i <= ; ++i) {
int nfa = finds(i);
if(fi[nfa]*sqr[l2 - l1] != se[nfa] && !vis[nfa])
F[++cnt] = i, vis[nfa] = ;
}
if(cnt == ) printf("YES\n");
else {
if(cnt > ) printf("NO\n");
else {
if(fi[F[]]*sqr[l2 - l1] + fi[F[]]*sqr[l2 - l1]== se[F[]] + se[F[]]) {
if(mp[(fi[F[]]*sqr[l2 - l1] - se[F[]])])printf("YES\n");
else printf("NO\n");
}
else printf("NO\n");
}
}
}
return ;
}
51 NOD 1753 相似子串 字符串hash的更多相关文章
- 51 Nod 1092 回文字符串
1092 回文字符串 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 收藏 关注 回文串是指aba.abba.cccbccc.aaaa这种左右对称的字符串.每 ...
- 字符串hash + 二分答案 - 求最长公共子串 --- poj 2774
Long Long Message Problem's Link:http://poj.org/problem?id=2774 Mean: 求两个字符串的最长公共子串的长度. analyse: 前面在 ...
- AcWing:139. 回文子串的最大长度(字符串Hash + 前缀和 + 后缀和 + 二分)
如果一个字符串正着读和倒着读是一样的,则称它是回文的. 给定一个长度为N的字符串S,求他的最长回文子串的长度是多少. 输入格式 输入将包含最多30个测试用例,每个测试用例占一行,以最多1000000个 ...
- POJ 1200 字符串HASH
题目链接:http://poj.org/problem?id=1200 题意:给定一个字符串,字符串只有NC个不同的字符,问这个字符串所有长度为N的子串有多少个不相同. 思路:字符串HASH,因为只有 ...
- LA4671 K-neighbor substrings(FFT + 字符串Hash)
题目 Source http://acm.hust.edu.cn/vjudge/problem/19225 Description The Hamming distance between two s ...
- 各种字符串Hash函数比较(转)
常用的字符串Hash函数还有ELFHash,APHash等等,都是十分简单有效的方法.这些函数使用位运算使得每一个字符都对最后的函数值产生影响.另外还有以MD5和SHA1为代表的杂凑函数,这些函数几乎 ...
- hdu 4622 Reincarnation 字符串hash 模板题
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4622 题意:给定一个长度不超过2000的字符串,之后有不超过1e5次的区间查询,输出每次查询区间中不同 ...
- [转]各种字符串Hash函数比较
转自:https://www.byvoid.com/zht/blog/string-hash-compare 常用的字符串Hash函数还有ELFHash,APHash等等,都是十分简单有效的方法.这些 ...
- 【转】各种字符串Hash函数比较
常用的字符串Hash函数还有ELFHash,APHash等等,都是十分简单有效的方法.这些函数使用位运算使得每一个字符都对最后的函数值产生影响.另外还有以MD5和SHA1为代表的杂凑函数,这些函数几乎 ...
随机推荐
- Dumb Bones(uva 10529)
题意:给定n,表示要放n个骨牌,每次放下骨牌,有可能向左倒的概率为pl,向右倒的概率为pr,如果倒下,会将那一侧的骨牌全部推倒,可以选择位置先后放骨牌,问说一种放骨牌次数最少的期望是多少. /* 设d ...
- 我要好offer之 搜索算法大总结
1. 二分搜索 详见笔者博文:二分搜索的那些事儿,非常全面 2. 矩阵二分搜索 (1) 矩阵每行递增,且下一行第一个元素大于上一个最后一个元素 (2) 矩阵每行递增,且每列也递增 3. DFS 深度优 ...
- 转 Django+Bootstrap练习--我的类博客系统开发
转自: http://blog.sina.com.cn/s/blog_7e050dc80102w312.html 本文记录了一个类博客网站从无到有的搭建过程,同时也是我入门django以及再次入门前端 ...
- win7dos删除文件和删除文件夹
如果要删除呢?也简单:假设删除d盘下的123文件夹 del/s/q d:\123\*.* ----(用于删除文件夹下的子文件) rd/s/q d:\123 ----(用于删除文件夹) /s参数为子目录 ...
- 找小于N 的所有质数
笔试题目当中,找素数出现的几率有点大.昨天就做了一个,感觉不是很难,但可以考查程序员的数学和编码功底. 用嵌套循环来实现是很理想的,怎样减少循环的次数?怎样求出小于N的所有质数? 不可能将一个数除与所 ...
- 【面试】最容易被问到的N种排序算法!
面试官:小明,是吧?你都知道哪些排序算法,哪几种是稳定排序? 小明:这个我有总结! 关于排序稳定性的定义 通俗地讲就是能保证排序前两个相等的数其在序列的前后位置顺序和排序后它们两个的前后位置顺序相同. ...
- es6系列-变量声明
es6系列所有文章都是阅读阮一峰老师的<ES6标准入门>(第2版)所做的读书笔记.方便日后查阅相关基础知识. git地址: https://github.com/rainnaZR/es6- ...
- Oracle SOA Suit Adapter
SOA架构的一个核心的使命是整合企业现存的各式各样的计算资源,它不仅仅是代码层面的整合,更是硬件,计算能力,服务能力的整合.Oracle SOA Suite在这方面做得特别的贴切,它提供了一组Adap ...
- Swift oc 混编 - oc导入Swift协议
(默认已经设置好桥接头文件)1.在Swift文件中写好协议2.oc类文件中导入:"项目名-swift.h"格式的文件 即:#include "项目名-swift.h&qu ...
- iOS -- 原生NSStream实现socket
- (void)startSocket:(NSString *)address andPort:(int)port { CFReadStreamRef readRef; CFWriteStreamRe ...