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( ...
随机推荐
- 基于cornerstone.js的dicom医学影像查看浏览功能
最近由于项目需求,需要医学影像.dcm文件的预览功能,功能完成后,基于原生Demo做一个开源分享. 心急的小伙伴可以先看如下基于原生js的全部代码: 一.全部代码 <!DOCTYPE html& ...
- 业务可视化-让你的流程图"Run"起来(4.实际业务场景测试)
前言 首先,感谢大家对上一篇文章[业务可视化-让你的流程图"Run"起来(3.分支选择&跨语言分布式运行节点)]的支持. 下面我以实际业务场景为例,来介绍一下ladybug ...
- flex 我所理解不够深刻的内容
1.align-items属性 父元素 align-items属性定义项目在交叉轴上如何对齐. flex-start:交叉轴的起点对齐. flex-end:交叉轴的终点对齐. center:交叉轴 ...
- javascript相邻节点元素获取
<script> window.onload = function () { var myLinkItem = document.getElementById('linkItem'); v ...
- 在阿里云Centos7.6上利用docker搭建Jenkins来自动化部署Django项目
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_84 一般情况下,将一个项目部署到生产环境的流程如下: 需求分析-原型设计-开发代码-内网部署-提交测试-确认上线-备份数据-外网更 ...
- placeholder 设置换行三种方式
在 html 中编写代码时保留代码换行 <textarea name="" id="" cols="30" rows="10 ...
- 数据分表Mybatis Plus动态表名最优方案的探索
一.应用场景 大家在使用Mybatis进行开发的时候,经常会遇到一种情况:按照月份month将数据放在不同的表里面,查询数据的时候需要跟不同的月份month去查询不同的表. 但是我们都知道,Mybat ...
- Fiddler抓包工具下载安装及使用
一.Fiddler简介 简介: Fiddler是一款强大的Web调试工具,他能记录所有客户端和服务器的HTTP/HTTPS请求 工作原理: Fiddler是以代理web服务器的形式工作的,它使用代理地 ...
- Linux 安装 Tomcat 详细教程
Linux 安装Tomcat详细步骤 1. 前往tomcat官网复制下载链接, tomcat官网地址:https://tomcat.apache.org/ 2. 进入到指定目录,使用 wget 命令下 ...
- MySQL事务概念与流程和索引控制
MySQL事务概念与流程和索引控制 视图 1.什么是视图 我们在执行SQL语句其实就是对表进行操作,所得到的其实也是一张表,而我们需要经常对这些表进行操作,拼接什么的都会产生一张虚拟表,我们可以基于该 ...