好多题解用的扩展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+树状数组)的更多相关文章

  1. [bzoj2124]等差子序列(hash+树状数组)

    我又来更博啦     2124: 等差子序列 Time Limit: 3 Sec  Memory Limit: 259 MBSubmit: 941  Solved: 348[Submit][Statu ...

  2. URAL-1989 Subpalindromes 多项式Hash+树状数组

    题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1989 题意:给出一个字符串,m个操作:1,修改其中一个字符串,2,询问 [a, b] 是 ...

  3. acdream1197 Points In Cuboid(hash树状数组)

    题目链接:http://acdream.info/problem?pid=1197 题意:给出三维空间n个点,m个查询,每次查询某个立方体内的点的个数. 思路:按照一维排序,根据查询插入,其他两位用二 ...

  4. CF452F Permutations/Luogu2757 等差子序列 树状数组、Hash

    传送门--Luogu 传送门--Codeforces 如果存在长度\(>3\)的等差子序列,那么一定存在长度\(=3\)的等差子序列,所以我们只需要找长度为\(3\)的等差子序列.可以枚举等差子 ...

  5. ACdreamoj 1011(树状数组维护字符串hash前缀和)

    题目链接:http://acdream.info/problem? pid=1019 题意:两种操作,第一种将字符串某个位置的字符换为还有一个字符.另外一种查询某个连续子序列是否是回文串: 解法:有两 ...

  6. ural 1989(树状数组+多项式hash)

    题意:给出一个字符串.有两种操作,一个是p a b,问字符串从位置a到位置b的子串是否是一个回文子串.还有一个操作 c a b,把字符串位置a的字符替换为b. 题解:由于字符串长度为1e5且问的次数也 ...

  7. [bzoj1892][bzoj2384][bzoj1461][Ceoi2011]Match/字符串的匹配_KMP_树状数组

    2384: [Ceoi2011]Match 1892: Match 1461: 字符串的匹配 题目大意: 数据范围: 题解: 很巧妙的一道题呀. 需要对$KMP$算法有很深的理解才行. 首先我们需要发 ...

  8. bzoj 2124 等差子序列 树状数组维护hash+回文串

    等差子序列 Time Limit: 3 Sec  Memory Limit: 259 MBSubmit: 1919  Solved: 713[Submit][Status][Discuss] Desc ...

  9. day 1 堆 hash 线段树 树状数组 冰茶姬 字典树 二叉查找树

    来郑州的第二天,早上开始也没说什么就说了些注意安全,各种各样的注意安全... 冰茶姬: 原来再打食物链时看了一下冰茶姬,只注意了路径压缩,没想到还有什么按秩排序但确实快了不少... int find( ...

随机推荐

  1. 平衡树——splay 一

    splay 一种平衡树,同时也是二叉排序树,与treap不同,它不需要维护堆的性质,它由Daniel Sleator和Robert Tarjan(没错,tarjan,又是他)创造,伸展树是一种自调整二 ...

  2. efcore在Saas系统下多租户零脚本分表分库读写分离解决方案

    efcore在Saas系统下多租户零脚本分表分库读写分离解决方案 ## 介绍 本文ShardinfCore版本x.6.0.20+ 本期主角: - [`ShardingCore`](https://gi ...

  3. 筛 sigma_k

    问题 定义 \(\sigma_k(n)\) 表示 \(n\) 的所有约数的 \(k\) 次方和,即 \[\sigma_k(n)=\sum_{d\mid n}d^k \] 问题:求 \(\sigma_k ...

  4. PHP操作路由器

    用PHP操作路由器 我们经常会碰到需要自动换IP的需求,比方模拟点击投票,数据采集被封IP,Alexa作弊等等,也就是需要经常换IP的,我们都可以通过PHP控制路由器来换IP,这样就不需要用按键精灵搞 ...

  5. MySQL主从复制原理及搭建过程

    GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 复制概述 复制即把一台服务器上的数据通过某种手段同步到另外一台或多台从服务器上,使得从服务器在数据上与主服务器保持一致. ...

  6. OpenStack-iaas之“先点”云平台安装

    1.认识OpenStack 1.云计算的起源 早在2006年3月,亚马逊公司首先提出弹性计算云服务.2006年8月9日,谷歌公司首席执行官埃里克·施密特(Eric Schmidt)在谷歌搜索引擎大会( ...

  7. ENSP 与VMware workstation 同时安装会出现AR40 或者VMware蓝屏

    前言: 你已经安装了VMware workstation,ENSP,Virtualbox,并且关闭了hyper-v,还会出现报错或者VMware蓝屏. #此处补充一条命令systeminfo 如果你看 ...

  8. docker启动失败问题

    内核3.10,systemctl start docker 被阻塞,没有返回,查看状态为启动中. 某兄弟机器安装docker之后,发现systemctl start docker的时候阻塞,由于排查走 ...

  9. 聊天机器人框架Rasa资源整理

      Rasa是一个主流的构建对话机器人的开源框架,它的优点是几乎覆盖了对话系统的所有功能,并且每个模块都有很好的可扩展性.参考文献收集了一些Rasa相关的开源项目和优质文章. 一.Rasa介绍 1.R ...

  10. 【java】学习路径42-六种字符流使用实例

    第一种 OutputStreamWriter OutputStreamReader 第二种 FileWriter FileReader 第三种 BufferedWriter BufferedReade ...