题意:取出字符串Str里的两个串S,T,问对应位置的的字符在否有一一映射关系。

hash:对于每个字符s=‘a’-‘z’,我们任意找一个i,满足Si==s,(代码里用lower_bound在区间找到最小的位置i)其对应的字符为Ti==t。然后我们判断这段区间里s的hash值是否等于t的hash值。不难证明26个字母都满足时对应hash相同时,才有一一映射关系。(但是不明白我的自然溢出的hash版本为什么错了,但是mod(1e9+7)的版本对了?

#include<bits/stdc++.h>
using namespace std;
#define ll unsigned long long
const int maxn=;
const int seed=;
const int Mod=1e9+;
ll Hash[][maxn],g[maxn];
int a[][maxn],N;
char c[maxn];
ll gethash(int chr,int x,int Len)
{
return ((Hash[chr][x+Len-]-Hash[chr][x-]*g[Len]%Mod)+Mod)%Mod;
}
bool check(int x,int y,int Len)
{
int i,pos;
for(i=;i<;i++){
pos=lower_bound(a[i]+,a[i]++a[i][],x)-a[i];
if(pos>a[i][]||a[i][pos]>x+Len-) continue;
if(gethash(i,x,Len)!=gethash(c[y-x+a[i][pos]]-'a',y,Len)) return false;
}
return true;
}
int main()
{
int Q,x,y,len,i,j;
scanf("%d%d",&N,&Q);
scanf("%s",c+); g[]=;
for(i=;i<=N;i++){
g[i]=g[i-]*seed%Mod;
for(j=;j<;j++)
Hash[j][i]=(Hash[j][i-]*seed+(c[i]-'a'==j))%Mod;
a[c[i]-'a'][++a[c[i]-'a'][]]=i;
}
while(Q--){
scanf("%d%d%d",&x,&y,&len);
if(check(x,y,len)) printf("YES\n");
else printf("NO\n");
}
return ;
}

下面是自然溢出的has版本

#include<bits/stdc++.h>
using namespace std;
#define ll unsigned long long
const int maxn=;
const int seed=;
ll Hash[][maxn],g[maxn];
int a[][maxn],N;
char c[maxn];
ll gethash(int chr,int x,int Len)
{
return Hash[chr][x+Len-]-Hash[chr][x-]*g[Len];
}
bool check(int x,int y,int Len)
{
int i,pos;
for(i=;i<;i++){
pos=lower_bound(a[i]+,a[i]++a[i][],x)-a[i];
if(pos>a[i][]||a[i][pos]>x+Len-) continue;
if(gethash(i,x,Len)!=gethash(c[y-x+a[i][pos]]-'a',y,Len)) return false;
}
return true;
}
int main()
{
int Q,x,y,len,i,j;
scanf("%d%d",&N,&Q);
scanf("%s",c+); g[]=;
for(i=;i<=N;i++){
g[i]=g[i-]*seed;
for(j=;j<;j++)
Hash[j][i]=Hash[j][i-]*seed+(c[i]-'a'==j);
a[c[i]-'a'][++a[c[i]-'a'][]]=i;
}
while(Q--){
scanf("%d%d%d",&x,&y,&len);
if(check(x,y,len)) printf("YES\n");
else printf("NO\n");
}
return ;
}

最新文章

  1. 构建自己的PHP框架--构建模版引擎(1)
  2. git常使用命令整理
  3. python利用redis构成一个队列
  4. 在Angular1.X中使用CSS Modules
  5. (转)C语言_测试程序运行内存状态GlobalMemoryStatus使用案例
  6. Excel 使用CHIINV函数和GAMMA.DIST函数绘制卡方分布
  7. 如何在其他电脑上运行VS2005编译的DEBUG版应用程序
  8. 批量清除.svn 或 _svn
  9. iframe session过期跳转到登陆页面
  10. ASP.NET MVC4 学习系统三(控制器Controller)
  11. a different object with the same identifier value was already associat
  12. 30款css3实现的鼠标经过图片显示描述特效
  13. java命令模式
  14. gentoo下的wpa_supplicant无线网配置
  15. XStream简单使用01——xml和Ojbect互转
  16. 【AngularJS】——0.分析
  17. 第五章:最后一步准备,1.8的Json模型、状态描述机制详解
  18. [PHP]利用MetaWeblog API实现XMLRPC功能
  19. C#/VB.NET 操作Word批注(二)——如何插入图片、读取、回复Word批注内容
  20. Python网络爬虫之三种数据解析方式

热门文章

  1. php——数据库操作之规范性
  2. eopkg命令
  3. Java重写父类使用@Override时出现The method destroy() of type xxx must override a superclass method的问题解决
  4. table合并单元格
  5. Android-studio 连接真机 调试weex项目
  6. Flex事件机制学习-自定义事件实现类间通信 .
  7. python实现的一个简单的网页爬虫
  8. 2014MadCon厦门分享会-笔记(下)
  9. Android Studio代码自己主动检測错误提示
  10. 嵌入式驱动开发之2440/2410---uboot 移植