CodeForces985F:Isomorphic Strings (字符串&hash)
2024-09-02 05:24:38
题意:取出字符串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 ;
}
最新文章
- 构建自己的PHP框架--构建模版引擎(1)
- git常使用命令整理
- python利用redis构成一个队列
- 在Angular1.X中使用CSS Modules
- (转)C语言_测试程序运行内存状态GlobalMemoryStatus使用案例
- Excel 使用CHIINV函数和GAMMA.DIST函数绘制卡方分布
- 如何在其他电脑上运行VS2005编译的DEBUG版应用程序
- 批量清除.svn 或 _svn
- iframe session过期跳转到登陆页面
- ASP.NET MVC4 学习系统三(控制器Controller)
- a different object with the same identifier value was already associat
- 30款css3实现的鼠标经过图片显示描述特效
- java命令模式
- gentoo下的wpa_supplicant无线网配置
- XStream简单使用01——xml和Ojbect互转
- 【AngularJS】——0.分析
- 第五章:最后一步准备,1.8的Json模型、状态描述机制详解
- [PHP]利用MetaWeblog API实现XMLRPC功能
- C#/VB.NET 操作Word批注(二)——如何插入图片、读取、回复Word批注内容
- Python网络爬虫之三种数据解析方式
热门文章
- php——数据库操作之规范性
- eopkg命令
- Java重写父类使用@Override时出现The method destroy() of type xxx must override a superclass method的问题解决
- table合并单元格
- Android-studio 连接真机 调试weex项目
- Flex事件机制学习-自定义事件实现类间通信 .
- python实现的一个简单的网页爬虫
- 2014MadCon厦门分享会-笔记(下)
- Android Studio代码自己主动检測错误提示
- 嵌入式驱动开发之2440/2410---uboot 移植