1735  相似子串 
基准时间限制:5 秒 空间限制:131072 KB 分值: 80
 
两个字符串相似定义为:
1.两个字符串长度相等
2.两个字符串对应位置上有且仅有至多一个位置所对应的字符不相同
给定一个字符串,每次询问两个子串在给定的规则下是否相似。给定的规则指每次给出一些等价关系,如‘a'=’b',‘b'=’c'等,注意这里的等价关系具有传递性,即若‘a'=’b',‘b'=’c',则‘a'=’c'。
Input
第一行一个字符串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行每行两个连续的字符表示这两个字符等价。
此题中所有的字符均为小写字母。
Output
T行,若相似则输出“YES”否则输出“NO”
Input示例
abac
3
1 1 2 3 4
bc
1 1 2 3 4
ac
1 1 2 2 3
ac
Output示例
 
YES
YES
NO
题解:
  hash值是由一系列字符* base^i 组成的,这里首先按照字母归类(如“aba”,按“a”归类即为“a”*( base^1+base^3 ))
  如果只是判断在给定规则下是否相等,那么可以把归类后26个字母对应的hash值按照并查集里的等价关系进行累加,

    若某一联通块所对应的hash值的总和在两个串中不相等则两个串在给定规则下不相等,否则相等。
   考虑只有一个位置不同的情况,那么必然是存在两个联通块对应的hash在两个串上不相等,且这两个差值是base的某个幂次的两个相反数,
  那么预处理一下base所有次幂并存下即可。
  时间复杂度O((|S|+T)*26)
#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的更多相关文章

  1. 51 Nod 1092 回文字符串

    1092 回文字符串  基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题  收藏  关注 回文串是指aba.abba.cccbccc.aaaa这种左右对称的字符串.每 ...

  2. 字符串hash + 二分答案 - 求最长公共子串 --- poj 2774

    Long Long Message Problem's Link:http://poj.org/problem?id=2774 Mean: 求两个字符串的最长公共子串的长度. analyse: 前面在 ...

  3. AcWing:139. 回文子串的最大长度(字符串Hash + 前缀和 + 后缀和 + 二分)

    如果一个字符串正着读和倒着读是一样的,则称它是回文的. 给定一个长度为N的字符串S,求他的最长回文子串的长度是多少. 输入格式 输入将包含最多30个测试用例,每个测试用例占一行,以最多1000000个 ...

  4. POJ 1200 字符串HASH

    题目链接:http://poj.org/problem?id=1200 题意:给定一个字符串,字符串只有NC个不同的字符,问这个字符串所有长度为N的子串有多少个不相同. 思路:字符串HASH,因为只有 ...

  5. LA4671 K-neighbor substrings(FFT + 字符串Hash)

    题目 Source http://acm.hust.edu.cn/vjudge/problem/19225 Description The Hamming distance between two s ...

  6. 各种字符串Hash函数比较(转)

    常用的字符串Hash函数还有ELFHash,APHash等等,都是十分简单有效的方法.这些函数使用位运算使得每一个字符都对最后的函数值产生影响.另外还有以MD5和SHA1为代表的杂凑函数,这些函数几乎 ...

  7. hdu 4622 Reincarnation 字符串hash 模板题

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4622 题意:给定一个长度不超过2000的字符串,之后有不超过1e5次的区间查询,输出每次查询区间中不同 ...

  8. [转]各种字符串Hash函数比较

    转自:https://www.byvoid.com/zht/blog/string-hash-compare 常用的字符串Hash函数还有ELFHash,APHash等等,都是十分简单有效的方法.这些 ...

  9. 【转】各种字符串Hash函数比较

    常用的字符串Hash函数还有ELFHash,APHash等等,都是十分简单有效的方法.这些函数使用位运算使得每一个字符都对最后的函数值产生影响.另外还有以MD5和SHA1为代表的杂凑函数,这些函数几乎 ...

随机推荐

  1. 2016 Multi-University Training Contest 10 solutions BY BUPT

    1001. 一个数组上的两个区间求中位数,可以通过分类讨论直接找到中位数,复杂度O(1).不过本题数据较小,优美的log(n)也可过. 1002. 直接求得阴影面积表达式即可. 1003. 二分完成时 ...

  2. TroubleShoot: SharePoint 2013: ExecuteOrDelayUntilScriptLoaded 页面发布后不执行的问题

    SharePoint 2010 中的ExecuteOrDelayUntilScriptLoaded,在2013 中使用时没有效果的问题. Example: SharePoint 2013 Code: ...

  3. 安装phpssdb扩展:

    安装 igbinary   扩展(安装phpssdb扩展时候要用到--enable-ssdb-igbinary): clone  https://github.com/igbinary/igbinar ...

  4. Mac下Android SDK更新不了的解决办法

    在hosts文件中加入: 203.208.46.146   dl.google.com 203.208.46.146 dl-ssl.google.com

  5. 大视野 1016: [JSOI2008]最小生成树计数(最小生成树)

    总结:此类题需要耐心观察规律,大胆猜想,然后证明猜想,得到有用的性质,然后解答. 简单的说:找隐含性质. 传送门:http://61.187.179.132/JudgeOnline/problem.p ...

  6. 本地安装Sass,Compass

    使用本地的gem文件来安装Sass和Compass. 1.安装Ruby http://rubyinstaller.org/downloads/ 下载之后双击安装即可,在安装过程中可以选择“Add Ru ...

  7. 遍历删除List中的元素,会报错?

    经常会碰到遍历集合,然后删除里面的对象报错, 纠结半天, 百度了一下,有大神说不能用for-each,  for , 只能用迭代器,真的吗?  我就删成功了呢,看代码,请大神们指正! public s ...

  8. BZOJ 3309 莫比乌斯反演

    题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=3309 题意:定义f(n)为n所含质因子的最大幂指数,求 $Ans=\sum _{i=1} ...

  9. datetimepicker使用总结

    datetimepicker使用总结 2019-03-06    16:55:00 使用效果: 官方教程:http://www.bootcss.com/p/bootstrap-datetimepick ...

  10. SSL/TLS协议

    今天闲着给自己的网站申请了一个免费证书,顺便复习下SSL/TLS协议    (https 就是在http+ssl协议) SSL介绍: 安全套接字(Secure Socket Layer,SSL)协议是 ...