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. [转]使用ProxyFactoryBean创建AOP代理

    http://doc.javanb.com/spring-framework-reference-zh-2-0-5/ 7.5. 使用ProxyFactoryBean创建AOP代理 - Spring F ...

  2. Codeforces989E. A Trance of Nightfall

    $n \leq 200$个平面上的点,$q \leq 200$次询问:重复操作$m \leq 10000$次,到达点$x$的概率最大是多少.操作:一开始选点$P$,不一定要是给定点,可以是平面上任一点 ...

  3. 学习javascript设计模式之代理模式

    1.代理模式为一个对象提供一个代用品或占位符,以便控制对它的访问. 2.不用代理模式: 客户 -> 本体  使用代理模式:  客户 -> 代理 -> 本体 3.例子场景1 点击操作与 ...

  4. 标准C程序设计七---33

    Linux应用             编程深入            语言编程 标准C程序设计七---经典C11程序设计    以下内容为阅读:    <标准C程序设计>(第7版) 作者 ...

  5. 36深入理解C指针之---结构体的内存处理

    一.有关结构体的内存处理包括,结构体指针和结构体成员指针的内存分配.结构体成员的数据对齐.结构体的内存释放 1.定义:与自定义数据类型(结构体)有关的内存分配.大小和释放问题 2.特征: 1).用内存 ...

  6. Perl语言入门--2--perl的运算符

    一.算数运算符 **:是幂 结果不能超过数的范围 当指数为小数时 底数不能为负数 %:取余数  两边的操作数为整数,如果不是则要截取,把所有的小数部分去掉 注意:当一个字符串参加运算,需要转化为整数时 ...

  7. IOS-input元素光标偏移乱跑,是什么原因

    这中情况只会出现在一些ios手机上,是兼容性的问题,当然我没有认真的确认过是出现在那些ios系统上的: 之所以出现这种情况,肯定是在input上或TA的父元素上用到了position:fixed; 目 ...

  8. Java出现错误“Invalid escape sequence (valid ones are \b \t \n \f \r \" \' \\ )”的问题分析

    若出现:Invalid escape sequence (valid ones are  \b  \t  \n  \f  \r  \"  \'  \\ )这样的问题,一般是转义字符的问题,下 ...

  9. Jenkins构建完成后通过SVN Publisher Plugin上传文件到指定的SVN(教程收集)

    SVN Publisher Plugin:https://wiki.jenkins-ci.org/display/JENKINS/SVN+Publisher 构建完成后的文件,比如Maven打的war ...

  10. HTML5 Canvas实现360度全景图

    原文:http://blog.csdn.net/jia20003/article/details/17172571 很多购物网站现在都支持360实物全景图像,可以360度任意选择查看样品,这样 对购买 ...