好多题解用的扩展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. SpringCloud微服务实战——搭建企业级开发框架(四十五):【微服务监控告警实现方式二】使用Actuator(Micrometer)+Prometheus+Grafana实现完整的微服务监控

      无论是使用SpringBootAdmin还是使用Prometheus+Grafana都离不开SpringBoot提供的核心组件Actuator.提到Actuator,又不得不提Micrometer ...

  2. Jetpack Compose学习(8)——State及remeber

    原文地址: Jetpack Compose学习(8)--State状态及remeber关键字 - Stars-One的杂货小窝 之前我们使用TextField,使用到了两个关键字remember和mu ...

  3. JavaWeb--Servlet详解

    前言 Java Web 其实就是一个技术的总和,把Web看成一个容器而已主要使用JavaEE技术来实现.在加上各种中间件. 整个javaWeb阶段的内容通过实际的案例贯穿学习, 所涉及到的技术知识点会 ...

  4. nodejs学习总结02

    response对象常用的API #response对象 response  对象类型<http.ServerResponse> response对象常用成员:response.write ...

  5. YII的lazy loading

    版本1 require('class\class1.php'); require('class\class1.php'); if($is_girl){ echo 'this is a girl'; $ ...

  6. Odoo14 设置Binary字段默认值

    1 # Odoo 中的附件也就是Binary字段都是经过特殊处理的 2 # 首先是上传的时候会进行base64编码后再上传到服务器 3 # 服务器进行压缩存放在odoo文件仓库中 4 # 每个odoo ...

  7. js Fetch返回数据res.json()报错问题

    前言 一直以来在简单的场景中经常使用fetch代替第三方请求库, fetch是JavaScript的原生函数, 简单.高效.快速.稳定.可定制等等诸多优点.一直也是用着很是舒服,直到有一天它竟然报错了 ...

  8. 开发了一个安卓小软件“CSV联系人导入导出工具”,欢迎测试

    开发了一个安卓小软件"CSV联系人导入导出工具",欢迎测试.本软件可以帮你快速备份和恢复联系人,不用担心号码遗失,软件操作简单,使用方便. 下载地址: 百度网盘:https://p ...

  9. Luogu2858[USACO06FEB]奶牛零食Treats for the Cows (区间DP)

    我是个傻逼,这么水的题都会T #include <iostream> #include <cstdio> #include <cstring> #include & ...

  10. ubantu安装中文失败的改正方法

    情况说明 一开始我也是像博主们那样安装,但是一直在这个界面安装失败,太悲伤了!! 报错内容 c Failed to fetch http://us.archive.ubuntu.com/ubuntu/ ...