HDU 3973 AC's String 字符串哈希
通过哈希函数将一个字符串转化为一个整数,通过特定的方式可以使得这个哈希值几乎没有冲突(这就是关键之处,几乎没有视为没有= =!, 其实也可以考虑实现哈希冲突时的处理,只是这道题没必要而已),然后使用线段树维护修改后的哈希值。
因为输入的字符串只有26个,考虑使用一个大于等于26的素数p作为进制,然后将原串转化为一个p进制的数mod 2^63(也相当于自然溢出),然后这个数存入map中,然后使用线段树维护长串区间的哈希值,hash[l, r]表示将区间[l, r]的字符串转化为p进制数(哈希过程)的结果,那么对于当前区间[l, r]的两个子区间[l, m]与[m + 1, r]:
hash[l, r] = hash[l, m] + hash[m + 1, r] * (p ^ (m - l + 1))
使用线段树动态维护,查询区间的hash值,使用map查找,那么问题就解决了。
//#pragma comment(linker, "/STACK:1677721600")
#include <map>
#include <set>
#include <stack>
#include <queue>
#include <cmath>
#include <ctime>
#include <vector>
#include <cstdio>
#include <cctype>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;
#define INF 0x3f3f3f3f
#define inf (-((LL)1<<40))
#define lson k<<1, L, (L + R)>>1
#define rson k<<1|1, ((L + R)>>1) + 1, R
#define mem0(a) memset(a,0,sizeof(a))
#define mem1(a) memset(a,-1,sizeof(a))
#define mem(a, b) memset(a, b, sizeof(a))
#define FIN freopen("in.txt", "r", stdin)
#define FOUT freopen("out.txt", "w", stdout)
#define rep(i, a, b) for(int i = a; i <= b; i ++)
#define dec(i, a, b) for(int i = a; i >= b; i --) template<class T> T MAX(T a, T b) { return a > b ? a : b; }
template<class T> T MIN(T a, T b) { return a < b ? a : b; }
template<class T> T GCD(T a, T b) { return b ? GCD(b, a%b) : a; }
template<class T> T LCM(T a, T b) { return a / GCD(a,b) * b; } //typedef __int64 LL;
typedef long long LL;
const int MAXN = + ;
const int MAXM = ;
const double eps = 1e-;
LL MOD = ; const LL P = ; int t, n, m, cas = , l, r;
LL mi[MAXN];
char str[], ch;
map<LL, int>mp; void init() {
mi[] = ;
rep (i, , MAXN - ) {
mi[i] = mi[i - ] * P;
}
} int toNum(char ch) {
return ch - 'a' + ;
} LL Hash() {
LL ans = ;
int len = strlen(str);
dec (i, len - , ) {
ans = ans * P + toNum(str[i]);
}
return ans;
} struct SegTree {
LL ma[MAXN << ]; void update(int k, int L, int R, int p, int v) {
if(L == R) { ma[k] = v; return ; }
int mid = (L + R) >> ;
if(mid >= p) update(lson, p, v);
else update(rson, p, v);
ma[k] = ma[k << ] + ma[k << | ] * mi[mid - L + ];
} LL query(int k, int L, int R, int l, int r) {
if(r < L || R < l) return ;
if(l <= L && R <= r) return ma[k];
LL le = query(lson, l, r), ri = query(rson, l, r);
int mid = (L + R) >> ;
return le + ri * mi[max(mid - max(L, l) + , )];
} }st; int main()
{
// FIN;
init();
cin >> t;
while(t--) {
mp.clear();
mem0(st.ma);
scanf("%d%*c", &n);
rep (i, , n - ) {
scanf("%s", str);
mp[Hash()] = ;
}
scanf("%s", str);
int len = strlen(str);
rep (i, , len - ) {
st.update(, , len, i + , toNum(str[i]));
}
printf("Case #%d:\n", ++cas);
scanf("%d%*c", &m);
while(m --) {
scanf("%c", &ch);
if(ch == 'Q') {
scanf("%d %d%*c", &l, &r);
printf("%s\n", mp[st.query(, , len, ++l, ++r)] ? "Yes" : "No");
}
else {
scanf("%d %c%*c", &l, &ch);
st.update(, , len, ++l, toNum(ch));
}
}
}
return ;
}
HDU 3973 AC's String 字符串哈希的更多相关文章
- HDU - 3973 AC's String(Hash+线段树)
http://acm.hdu.edu.cn/showproblem.php?pid=3973 题意 给一个词典和一个主串.有两种操作,查询主串某个区间,问这主串区间中包含多少词典中的词语.修改主串某一 ...
- [HDU 4821] String (字符串哈希)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4821 题目大意:给你M,L两个字母,问你给定字串里不含M个长度为L的两两相同的子串有多少个? 哈希+枚 ...
- hdu 4300 Clairewd’s message 字符串哈希
Clairewd’s message Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- hdu 2296 aC自动机+dp(得到价值最大的字符串)
Ring Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- PAT 甲级 1047 Student List for Course (25 分)(cout超时,string scanf printf注意点,字符串哈希反哈希)
1047 Student List for Course (25 分) Zhejiang University has 40,000 students and provides 2,500 cou ...
- 牛客练习赛33 E tokitsukaze and Similar String (字符串哈希hash)
链接:https://ac.nowcoder.com/acm/contest/308/E 来源:牛客网 tokitsukaze and Similar String 时间限制:C/C++ 2秒,其他语 ...
- hdu3973 AC's String 线段树+字符串hash
题目链接:http://icpc.njust.edu.cn/Problem/Hdu/3973/ 题意是:给出一个模式串,再给出一些串组成一个集合,操作分为两种,一种是替换模式串中的一个字符,还有一种是 ...
- HDU 1880 魔咒词典(字符串哈希)
题目链接 Problem Description 哈利波特在魔法学校的必修课之一就是学习魔咒.据说魔法世界有100000种不同的魔咒,哈利很难全部记住,但是为了对抗强敌,他必须在危急时刻能够调用任何一 ...
- HDU 5842 Lweb and String(Lweb与字符串)
p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-s ...
随机推荐
- redis—Spring中redis缓存的简单使用
这里使用的是 Spring-4.3 , redis-2.8 的版本 1.添加maven依赖 <dependency> <groupId>redis.clients</ ...
- 两个星期,用Flutter撸个APP
前言 Flutter是Google推出的跨平台的解决方案,Slogan是"Design beautiful apps",国内也有知名企业在使用和推广,例如阿里.美团都有在尝试. 个 ...
- python webdriver 登录163邮箱发邮件加附件, 外加数据和程序分离,配置文件的方式
配置文件:UiObjectMapSendMap.ini用来存放配置信息 GetOptionSendMail.py 用来读取配信息 #encoding=utf-8from selenium.webdri ...
- this指向 - 开端
/* 这个主题 主要是为了论述 js 中一个最烦人的问题 --> this 的指向问题 其实,这个 this 到底指向什么,指向谁,查了好多资料.书籍.官文,也没有给出明确的一个结论, 也学这也 ...
- Buffer flip()方法
英文API:Flips this buffer. The limit is set to the current position and then the position is set to ze ...
- JAVA面试题整理(5)-数据库
数据库 1.Oracle/mysql分页有什么优化 2.悲观锁.乐观锁 悲观锁(Pessimistic Concurrency Control,PCC):假定会发生并发冲突,屏蔽一切可能违反数据完整性 ...
- MyBatis小案例完善增强
https://blog.csdn.net/techbirds_bao/article/details/9233599 上链接为一个不错的Mybatis进阶博客 当你把握时间,时间与你为伍. 将上一个 ...
- Ubuntu 安装Docker
参考:官网 安装依赖包: $ sudo apt-get update $ sudo apt-get install -y --no-install-recommends \ linux-image-e ...
- git status出现 fatal: Not a git repository (or any of the parent directories): .git
fatal: Not a git repository (or any of the parent directories): .git 提示说没有.git这样一个目录,解决办法如下: git ini ...
- hdu 4745 Two Rabbits 区间DP
http://acm.hdu.edu.cn/showproblem.php?pid=4745 题意: 有两只兔子Tom Jerry, 他们在一个用石头围城的环形的路上跳, Tom只能顺时针跳,Jerr ...