题解 [51nod1753] 相似子串

题面

解析

先考虑相等的时候怎么办,

我们考虑求出每个字母的贡献,这样字母相等的问题就可以用并查集来解决.

具体来说,我们先对于每个字母,把S中等于它的标为1,其它的标为0,

那么S对于每个字母都有一个01串的形式,

再考虑对每个01串hash,

在统计答案的时候就枚举字母将它的hash值加到它并查集的贡献里去.

再考虑有一个不相等的情况,

这时设一个字符为a1,另一个为a2,

那么只有这两个字母的贡献不一样,

而这两个字母的贡献的值肯定是hash用的p进制的p的非负整数幂,

于是用map存一下p的非负整数幂就好了.

code:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <map>
#define ll long long
#define fre(x) freopen(x".in","r",stdin),freopen(x".out","w",stdout)
using namespace std; inline int read(){
int sum=0,f=1;char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){sum=sum*10+ch-'0';ch=getchar();}
return f*sum;
} const int N=300005;
const int P=199999;
const int Mod=1000000007;
int n,t,s[N],da[N];
ll has[27][N],f[2][27],po[N];
char S[N],T[5];
map<ll,int> mp; inline void init(){
for(int i=0;i<=26;i++) da[i]=i;
memset(f,0,sizeof(f));
} inline int find(int x){
return da[x]==x? x:da[x]=find(da[x]);
} inline int get(int i,int l,int r){
return ((has[i][r]-has[i][l-1]*po[r-l+1])%Mod+Mod)%Mod;
} inline void solve(){
init();
int K=read(),cnt=0;
int l1=read(),r1=read();
int l2=read(),r2=read();
for(int i=1;i<=K;i++){
scanf("%s",T+1);
int x=T[1]-'a',y=T[2]-'a';
da[find(x)]=da[find(y)];
}
for(int i=0;i<26;i++){
(f[0][find(i)]+=get(i,l1,r1))%=Mod;
(f[1][find(i)]+=get(i,l2,r2))%=Mod;
}
for(int i=0;i<26;i++){
if(f[0][i]==f[1][i]) continue;
int ret=(f[0][i]-f[1][i])%Mod;
ret=(ret+Mod)%Mod;
if(!mp.count(ret)) return (void)puts("NO");
s[++cnt]=mp[ret];
}
if(!cnt) return (void)puts("YES");
if(cnt>2) return (void)puts("NO");
if(s[1]+s[2]==0) puts("YES");
else puts("NO");
} signed main(){
scanf("%s",S+1);
n=strlen(S+1);
for(int i=0;i<26;i++){
has[i][0]=1;
for(int j=1;j<=n;j++){
has[i][j]=(has[i][j-1]*P%Mod+(S[j]==('a'+i)))%Mod;
}
}
po[0]=1;
for(int i=1;i<=n;i++) po[i]=po[i-1]*P%Mod;
for(int i=0;i<=n;i++) mp[po[i]]=i+1,mp[Mod-po[i]]=-i-1;
t=read();
while(t--) solve();
return 0;
}

题解 [51nod1753] 相似子串的更多相关文章

  1. 【做题】51NOD1753 相似子串——哈希

    题意:两个字符串相似定义为: 1.两个字符串长度相等 2.两个字符串对应位置上至多有一个位置所对应的字符不相同 给定一个字符串\(s\),\(T\)次询问两个子串在给定的规则下是否相似.给定的规则指每 ...

  2. 【USACO 3.1】Contact(01子串按出现次数排序)

    题意:给你一个01字符串,将长度为a到b之间(包含a.b)的子串按照出现次数排序.注意输入输出格式 题解:01子串对应一个二进制,为了区别11和011这样的不同子串,我们把长度也记录下来,官方题解是在 ...

  3. Codeforces Round #352 (Div. 2) ABCD

    Problems     # Name     A Summer Camp standard input/output 1 s, 256 MB    x3197 B Different is Good ...

  4. 【po3693】Maximum repetition substring

    题意: 给定一个字符串 求重复次数最多的连续重复子串 并输出字典序最小方案 题解: 枚举子串长度L 显然如果重复次数>1 那么答案串肯定包含s[1],s[1+L],s[1+L*2],...中的两 ...

  5. Zero Sum Subarray

    Given an integer array, find a subarray where the sum of numbers is zero. Your code should return th ...

  6. 【BZOJ3544】[ONTAK2010]Creative Accounting 前缀和+set

    [BZOJ3544][ONTAK2010]Creative Accounting Description 给定一个长度为N的数组a和M,求一个区间[l,r],使得(\sum_{i=l}^{r}{a_i ...

  7. Hdu-6230 2017CCPC-哈尔滨站 A.Palindrome Manacher 主席树

    题面 题意:给你一个字符串,问你满足s[i]=s[2n-i]=s[2n+i-2]的子串(这子串长度为3n-2)有多少个,原字符串长度<=5e5 题解:对于这种子串,其实要满足2个回文,跑过一次M ...

  8. Vijos1425子串清除 题解

    Vijos1425子串清除 题解   描述: 我们定义字符串A是字符串B的子串当且仅当我们能在B串中找到A串.现在给你一个字符串A,和另外一个字符串B,要你每次从B串中从左至右找第一个A串,并从B串中 ...

  9. 【LeetCode题解】3_无重复字符的最长子串(Longest-Substring-Without-Repeating-Characters)

    目录 描述 解法一:暴力枚举法(Time Limit Exceeded) 思路 Java 实现 Python 实现 复杂度分析 解法二:滑动窗口(双指针) 思路 Java 实现 Python 实现 复 ...

随机推荐

  1. 07 UML类图

    移步: https://www.cnblogs.com/coolstream/p/9572846.html

  2. LINUX驱动笔记 目录

    笔记参考了宋宝华老师的<Linux设备驱动开发详解:基于最新的Linux 4.0内核>以及韦东山老师的嵌入式驱动教程 笔记开发环境: 单板:第一章到第八章使用TINY4412-1611:第 ...

  3. python检测当前网卡流量信息,用于查看实时网速

    可以用来检测是否有挖矿程序在运行的一个子条件 # coding:utf-8 __author__ = 'chenhuachao' import wmi import time import platf ...

  4. SQL高级教程

    一.top子句 top子句用于规定要返回的记录的数目 并非所有数据库系统都支持top子句 # sqlserver SELECT TOP number|percent column_name(s) FR ...

  5. "一起来捉妖"怎么从瘸腿中组合到最合心意的妖灵

    背景: 最近两天活动,黑鬼白鬼合体觉醒秋容,陆无名,聂小倩,作为一个非土豪玩家,没有超高资质妖灵的我,想要在瘸腿妖灵中选取两个最佳选择,合体觉醒. 初选: 备选妖灵从5个维度录入数据,进行选择,分别为 ...

  6. Asp.Net Mvc Area二级域名

    参考:https://blog.maartenballiauw.be/post/2009/05/20/aspnet-mvc-domain-routing.html 参考:https://www.cnb ...

  7. 在Windows上安装Redis

    微软官网源码 https://github.com/MicrosoftArchive/redis 这里介绍安装Signed binaries版本 使用Chocolatey(Windows包管理工具)安 ...

  8. nodejs之express的中间件

    express中间件分成三种 内置中间件 static 自定义中间件 第三方中间件 (body-parser) (拦截器) 全局自定义中间件 在请求接口时 有几个接口都要验证传来的内容是否存在或者是否 ...

  9. Chrome安装crx文件的插件时出现“程序包无效”

    有趣的事,Python永远不会缺席! 如需转发,请注明出处:小婷儿的python   https://www.cnblogs.com/xxtalhr/p/11043453.html 链接:https: ...

  10. Computer Vision_33_SIFT:ORB_An efficient alternative to SIFT or SURF——2012

    此部分是计算机视觉部分,主要侧重在底层特征提取,视频分析,跟踪,目标检测和识别方面等方面.对于自己不太熟悉的领域比如摄像机标定和立体视觉,仅仅列出上google上引用次数比较多的文献.有一些刚刚出版的 ...