题目链接:点击查看

题目大意:首先规定同构字符串,若字符串s和字符串t互为同构字符串,则必须满足:

  1. 两个字符串长度相同
  2. s中的字符种类数与t中的字符种类数相同
  3. s中的每一个字母在t中都有对应,且必须是一对一的映射关系

举个很简单的例子,wwaaa和aaccc是同构字符串,aababc和bbcbcz也是同构字符串

现在给出m个询问,每次询问给出 x y len,问长度为len,分别以 x 和 y 为起点的字串是否互为同构字符串

题目分析:一开始没想到怎么去做,提示是哈希了之后也没有什么很好的办法,看了题解后感觉好巧妙的方法,真的算是学到了

回到这个题目上来,因为每个字母都是相对独立的关系,所以我们对于26个字母进行哈希,也就是在读入字符串后,预处理出Hash[i][j],表示位置为 i ,当前字母为 j 的哈希值是多少,这样预处理后,每次询问我们只需要对于子串 x 的每一个字母从子串 y 中找到一个不矛盾的映射关系就行,如果26个字母全部都能找到映射关系,且不冲突,则说明互为同构串

还是感觉直接看代码思路可能会比较清晰一点

最后说一点就是,对于单哈希来说,我一直使用的base=131,mod=ull_max会被hack掉。。不过用base=2333333,mod=999999998就能顺利AC,那以后写哈希就换成用这一套基数吧

代码:

#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cstring>
#include<algorithm>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<cmath>
#include<sstream>
#include<unordered_map>
using namespace std;typedef long long LL;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int N=2e5+100;const int base=2333333;const int mod=999999998;string s;int n,m;ull Hash[N][26],f[N];int nx[N][26],pos[26];//nx[i][j]:包含第i个位置在内,后面首次出现字母j的位置 void init()
{f[0]=1;for(int i=1;i<=n;i++)//预处理出每个字母的哈希值{f[i]=f[i-1]*base%mod;for(int j=0;j<26;j++)Hash[i][j]=(Hash[i-1][j]*base+(s[i]==char(j+'a')))%mod;
//这里的每一位哈希值非零即一,用来表示当前位置是否为当前字母}for(int j=0;j<26;j++)pos[j]=n+1;for(int i=n;i>=1;i--)//预处理出nx数组,简单dp{pos[s[i]-'a']=i;for(int j=0;j<26;j++)nx[i][j]=pos[j];}
}ull get_hash(int l,int r,int alpha)
{return (Hash[r][alpha]-Hash[l-1][alpha]*f[r-l+1]%mod+mod)%mod;
}bool solve(int x,int y,int len,int alpha)
{int pos=nx[x][alpha];//找到在x中对应的字母if(pos>x+len-1)//如果没找到说明x中不存在这个字母,直接返回truereturn true;pos+=y-x;//映射到y中的字母去return get_hash(x,x+len-1,alpha)==get_hash(y,y+len-1,s[pos]-'a');//判断哈希值是否相等
}bool check(int x,int y,int len)
{for(int j=0;j<26;j++)//枚举子串x中的每个字母是否有冲突 if(!solve(x,y,len,j))return false;return true;
}int main()
{
//  freopen("input.txt","r",stdin);
//  ios::sync_with_stdio(false);scanf("%d%d",&n,&m);cin>>s;s=" "+s;init();while(m--){int x,y,len;scanf("%d%d%d",&x,&y,&len);if(check(x,y,len))puts("YES");elseputs("NO");}return 0;
}

CodeForces - 985F Isomorphic Strings(字符串哈希)相关推荐

  1. CodeForces - 985F Isomorphic Strings

    假如两个区间的26的字母出现的位置集合分别是 A1,B1,A2,B2,....., 我们再能找到一个排列p[] 使得 A[i] = B[p[i]] ,那么就可以成功映射了. 显然集合可以直接hash, ...

  2. [LeetCode] Isomorphic Strings - 字符串操作:数组计数字符个数问题

    题目概述: Given two strings s and t, determine if they are isomorphic. Two strings are isomorphic if the ...

  3. CodeForces - 1200E Compress Words(字符串哈希)

    题目链接:点击查看 题目大意:给出n个字符串,现在需要将其依次合并,合并的规则是如果相邻两个字符串中的前后缀有相同的,则合并后省略掉后面字符串的前缀,我们需要保证这个相同的前后缀如果存在的情况下必须最 ...

  4. 【CodeForces】961 F. k-substrings 字符串哈希+二分

    [题目]F. k-substrings [题意]给定长度为n的串S,对于S的每个k-子串$s_ks_{k+1}...s_{n-k+1},k\in[1,\left \lceil \frac{n}{2} ...

  5. leetcode之Isomorphic strings

    问题来源:Isomorphic strings 问题描述:给定两个字符串,判断它俩是否满足同构关系.同构关系表示两个字符串的字符能一一对应,例如title和paper构成同构关系,而foo和bar不构 ...

  6. codeforces 616F Expensive Strings

    codeforces 616F Expensive Strings (广义后缀自动机) https://codeforces.com/contest/616/problem/F 题意: 给你n个字符串 ...

  7. 205 Isomorphic Strings

    205 Isomorphic Strings 链接:https://leetcode.com/problems/isomorphic-strings/ 问题描述: Given two strings ...

  8. String Hashing - 字符串哈希化

    String Hashing - 字符串哈希化 String Hashing (字符串哈希化) 简单理解就是将一个字符串转换为一个整数.一般情况下,hash 值会比原始值更易储存 (更小) 或比较. ...

  9. ELFhash - 优秀的字符串哈希算法

    原 ELFhash - 优秀的字符串哈希算法 分类:算法杂论算法精讲数据结构 (1424)  (2) 1.字符串哈希: 我们先从字符串哈希说起 在很多的情况下,我们有可能会获得大量的字符串,每个字符串 ...

最新文章

  1. 为什么不建议用try catch处理异常?
  2. 数据挖掘SPSS Clementine 12.0.3 多国语言(含中文)破解版
  3. form表单 无法提交js动态添加的表单元素问题。。
  4. 收集、报告或保存系统活动信息:sar命令
  5. CF917C. Pollywog
  6. PHP中功能强大却少使用的函数 -- 为你提供更多的思路
  7. E 定向 牛客练习赛25
  8. OpenGL入门学习 课程 (三) 绘制几何图形的一些细节问题
  9. python计算最大公约数函数_python如何分享解两数的最大公约数 python代码 最大公约和最小公倍数数计算?...
  10. Qt_QSS 样式表属性大全
  11. 【java】照片查看器:开发一个简易照片查看器,自行设计功能和界面。
  12. 能源消耗总量计算公式_能源统计
  13. 学云计算能从事什么工作 云计算就业怎么样
  14. 实时PPP多系统组合与单系统解算ZTD和Clock差异
  15. 产品沉思录精选:拒绝信息成瘾,重新思考你和信息的关系。
  16. javaSE探赜索隐四<基本排序算法>
  17. 开源优测-积微速成计划历次任务及总结
  18. 【操作系统】RR算法
  19. 解决failed to solve with frontend dockerfile.v0: failed to create LLB definition: unexpected status co
  20. 集成wangEditor富文本编辑器

热门文章

  1. linux如何开启sni服务,Nginx开启单IP多SSL证书支持-TLS SNI support
  2. Apollo创建项目
  3. SpringSecurity的csrf防护措施
  4. Nginx负载均衡策略介绍
  5. 客户端负载均衡?? 服务端负载均衡??
  6. 通道Channel-IO 多路复用
  7. 微服务网关路由过滤作用介绍
  8. 依赖注入_引用其他的bean
  9. 字符输出流_Writer类FileWriter类介绍
  10. spring配置详解-初始化销毁方法