P7114 [NOIP2020] 字符串匹配 (字符串hash+树状数组)
好多题解用的扩展KMP(没学过,所以不用这种方法)。
我们按照题目要求记F(s)表示s串的权值,可以预处理出前缀权值(用于A)和后缀权值(用于C),枚举AB的长度i=2~n-1,不需要分开枚举,我们只关心A,A可以从1扩展到i-1。有一个性质,不管AB重复多少次,C的权值只有两种,AB重复奇数次有一种,偶数次有一种,不影响C的字符出现次数的奇偶性。所以代码中hc[0]和hc[1]就是用来存这两种结果。要满足F(A)<=F(C),相当于是前缀查询,可以套一个树状数组(权值作为下标,不超过26)。然后就是枚举重复次数(字符串hash判定),累加答案就行了。
字符串hash的进制数我这里取的是13331,开ull储存,不用处理溢出问题,溢出相当于自动对264 取模。
1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 1100000
4 #define ull unsigned long long
5 #define ll long long
6 #define seed 13331
7 char s[N];
8 int pre[N],suf[N],n,cnt[N],nw,t[30],hc[3];
9 ull hx[N],pw[N];
10 void add(int p){
11 ++p;//树状数组不能处理为0的下标,均向右平移一位
12 while(p<=27){
13 ++t[p];
14 p+=p&(-p);
15 }
16 }
17
18 ll query(int p){
19 ll ans=0;++p;
20 while(p){
21 ans+=t[p];
22 p-=p&(-p);
23 }
24 return ans;
25 }
26
27 ull gethx(int l,int r){
28 return hx[r]-hx[l-1]*pw[r-l+1];
29 }
30
31 int main(){
32 int _;ll ans;
33 scanf("%d",&_);
34 while(_--){
35 memset(cnt,0,sizeof(cnt));
36 memset(t,0,sizeof(t));
37 scanf("%s",s+1);
38 n=strlen(s+1);
39 nw=0;ans=0;
40 pw[0]=1;
41 for(int i=1;i<=n;i++){
42 pw[i]=pw[i-1]*seed;
43 hx[i]=hx[i-1]*seed+s[i];//字符串hash
44 cnt[s[i]-'a']^=1;//前缀桶
45 if(cnt[s[i]-'a']) ++nw;
46 else --nw;
47 pre[i]=nw;//前缀权值
48 }
49 memset(cnt,0,sizeof(cnt));
50 nw=0;
51 for(int i=n;i>=1;i--){//同理,处理后缀权值
52 cnt[s[i]-'a']^=1;
53 if(cnt[s[i]-'a']) ++nw;
54 else --nw;
55 suf[i]=nw;
56 }
57 for(int way,p,i=2;i<n;i++){//i相当于枚举的是AB
58 add(pre[i-1]);//A可以从1扩展到i-1(B不为空)
59 hc[0]=query(suf[i+1]);//AB出现奇数次,C确定,A的可能情况有多少种
60 if(i+i+1<=n) hc[1]=query(suf[i+i+1]);//AB出现偶数次
61 p=i+1;way=0;
62 while(p<=n&&hx[i]==gethx(p-i,p-1)){//枚举重复次数
63 ans+=hc[way];
64 p+=i;
65 way^=1;
66 }
67 }
68 printf("%lld\n",ans);
69 }
70 return 0;
71 }
P7114 [NOIP2020] 字符串匹配 (字符串hash+树状数组)的更多相关文章
- [bzoj2124]等差子序列(hash+树状数组)
我又来更博啦 2124: 等差子序列 Time Limit: 3 Sec Memory Limit: 259 MBSubmit: 941 Solved: 348[Submit][Statu ...
- URAL-1989 Subpalindromes 多项式Hash+树状数组
题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1989 题意:给出一个字符串,m个操作:1,修改其中一个字符串,2,询问 [a, b] 是 ...
- acdream1197 Points In Cuboid(hash树状数组)
题目链接:http://acdream.info/problem?pid=1197 题意:给出三维空间n个点,m个查询,每次查询某个立方体内的点的个数. 思路:按照一维排序,根据查询插入,其他两位用二 ...
- CF452F Permutations/Luogu2757 等差子序列 树状数组、Hash
传送门--Luogu 传送门--Codeforces 如果存在长度\(>3\)的等差子序列,那么一定存在长度\(=3\)的等差子序列,所以我们只需要找长度为\(3\)的等差子序列.可以枚举等差子 ...
- ACdreamoj 1011(树状数组维护字符串hash前缀和)
题目链接:http://acdream.info/problem? pid=1019 题意:两种操作,第一种将字符串某个位置的字符换为还有一个字符.另外一种查询某个连续子序列是否是回文串: 解法:有两 ...
- ural 1989(树状数组+多项式hash)
题意:给出一个字符串.有两种操作,一个是p a b,问字符串从位置a到位置b的子串是否是一个回文子串.还有一个操作 c a b,把字符串位置a的字符替换为b. 题解:由于字符串长度为1e5且问的次数也 ...
- [bzoj1892][bzoj2384][bzoj1461][Ceoi2011]Match/字符串的匹配_KMP_树状数组
2384: [Ceoi2011]Match 1892: Match 1461: 字符串的匹配 题目大意: 数据范围: 题解: 很巧妙的一道题呀. 需要对$KMP$算法有很深的理解才行. 首先我们需要发 ...
- bzoj 2124 等差子序列 树状数组维护hash+回文串
等差子序列 Time Limit: 3 Sec Memory Limit: 259 MBSubmit: 1919 Solved: 713[Submit][Status][Discuss] Desc ...
- day 1 堆 hash 线段树 树状数组 冰茶姬 字典树 二叉查找树
来郑州的第二天,早上开始也没说什么就说了些注意安全,各种各样的注意安全... 冰茶姬: 原来再打食物链时看了一下冰茶姬,只注意了路径压缩,没想到还有什么按秩排序但确实快了不少... int find( ...
随机推荐
- java 向上,向下取整详解
向上取整函数:Math.ceil(double a); 向下取整函数:Math.floor(double a); 需要注意的是:取整是对小数的取整,由于java自动转型机制,两个整数的运算结果依然是整 ...
- python将命令输出写入文件或临时缓存
python将命令输出写入文件 将文件写入到对应文件,方便后期处理或保存 def write_file(file_path): with open(file=file_path, mode=" ...
- 清北学堂 2020 国庆J2考前综合强化 Day6
目录 1. 题目 T1 双色球计数 题目描述 Sol 炼金术 题目描述 Sol T3 地铁大亨 题目描述 Sol T4 结束的派对 题目描述 Sol 算法 - 分治 1. 分治 2. 二分 3. 倍增 ...
- Odoo14 ir.rule 中的domain查询语句
# ir.rule 中的domain查询语句 # 当你的字段是many2one.many2many.one2many的时候domain都会强制加上过滤域 # tree显示的时候也会过滤 # m.mod ...
- 大数据管理系统架构Hadoop
Hadoop 起源于Google Lab开发的Google File System (GFS)存储系统和MapReduce数据处理框架.2008年,Hadoop成了Apache上的顶级项目,发展到今天 ...
- Map集合的遍历方式以及TreeMap集合保存自定义对象实现比较的Comparable和Comparator两种方式
Map集合的特点 1.Map集合中保存的都是键值对,键和值是一一对应的 2.一个映射不能包含重复的值 3.每个键最多只能映射到一个值上 Map接口和Collection接口的不同 Map是双列集合的根 ...
- 开源深度思考 - In Community We Trust
作者 | 黄东旭,PingCAP 联合创始人&CTO 出品 | CSDN(ID:CSDNnews) 业界一直流传着黄东旭的传说:小学三年级开始写代码,四五年级学习C语言,初中毕业时,已经能够用 ...
- GCC常见命令
rwx 对于目录和文件的区别 文件 目录 r 文件的内容可以被查看.支持cat.more.head...vim 目录的内容可以被查看.ls.tree w 文件的内容可以被添加.修改.删除.vim &g ...
- Linux 03 用户管理
参考源 https://www.bilibili.com/video/BV187411y7hF?spm_id_from=333.999.0.0 版本 本文章基于 CentOS 7.6 概述 Linux ...
- Redis 07 有序集合
参考源 https://www.bilibili.com/video/BV1S54y1R7SB?spm_id_from=333.999.0.0 版本 本文章基于 Redis 6.2.6 Zset 就是 ...