[bzoj4650]优秀的拆分
由于字符串是AABB的形式,枚举AA和BB中间的位置,分别考虑AA和BB的数量,乘起来sigma一下即为答案
以下考虑AA的情况(BB同理),枚举A的长度,然后按照这个长度分为若干块,那么每一个A一定可以表示成某一段的结尾+下一段的开头,同时两个A又要连续,也就是相邻两块的lcp和lcs,用差分来维护即可
1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 30005
4 #define mod 998244353
5 #define mid (l+r+1>>1)
6 int t,n,sum[N],mi[N],f1[N],f2[N];
7 long long ans;
8 char s[N];
9 int hash(int x,int y){
10 if (y<x)return 0;
11 if (!x)return sum[y];
12 return (sum[y]-1LL*sum[x-1]*mi[y-x+1]%mod+mod)%mod;
13 }
14 bool pd(int x1,int y1,int x2,int y2){
15 return hash(x1,y1)==hash(x2,y2);
16 }
17 void calc(int x,int y){
18 int l=0,r=min(y-x,n-y),p=0;
19 while (l<r)
20 if (pd(x,x+mid-1,y,y+mid-1))l=mid;
21 else r=mid-1;
22 swap(l,p);
23 r=min(x+1,y-x-1);
24 while (l<r)
25 if (pd(x-mid,x-1,y-mid,y-1))l=mid;
26 else r=mid-1;
27 l=p;
28 if (l+r<y-x)return;
29 f1[x-r]++;
30 f1[2*x-y+l+1]--;
31 f2[2*y-x-r-1]++;
32 f2[y+l]--;
33 }
34 int main(){
35 scanf("%d",&t);
36 mi[0]=1;
37 for(int i=1;i<N-4;i++)mi[i]=mi[i-1]*31LL%mod;
38 while (t--){
39 scanf("%s",s);
40 memset(f1,0,sizeof(f1));
41 memset(f2,0,sizeof(f2));
42 n=strlen(s);
43 sum[0]=s[0]-'a'+1;
44 for(int i=1;i<n;i++)sum[i]=(sum[i-1]*31LL+s[i]-'a'+1)%mod;
45 for(int i=1;i<=n;i++)
46 for(int j=i-1;j+i<n;j+=i)calc(j,j+i);
47 ans=0;
48 for(int i=1;i<n;i++){
49 f1[i]+=f1[i-1];
50 f2[i]+=f2[i-1];
51 ans+=1LL*f1[i]*f2[i-1];
52 }
53 printf("%lld\n",ans);
54 }
55 }
[bzoj4650]优秀的拆分的更多相关文章
- 【BZOJ4650】【NOI2016】优秀的拆分(后缀数组)
[BZOJ4650][NOI2016]优秀的拆分(后缀数组) 题面 BZOJ Uoj 题解 如果我们知道以某个位置为开始/结尾的\(AA\)串的个数 那就直接做一下乘法就好 这个怎么求? 枚举一个位置 ...
- [UOJ#219][BZOJ4650][Noi2016]优秀的拆分
[UOJ#219][BZOJ4650][Noi2016]优秀的拆分 试题描述 如果一个字符串可以被拆分为 AABBAABB 的形式,其中 A 和 B 是任意非空字符串,则我们称该字符串的这种拆分是优秀 ...
- BZOJ4650:[NOI2016]优秀的拆分——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=4650 https://www.luogu.org/problemnew/show/P1117 如果 ...
- BZOJ4650/UOJ219 [Noi2016]优秀的拆分
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
- BZOJ4650 [NOI2016]优秀的拆分 【后缀数组】
题目 如果一个字符串可以被拆分为 AABBAABB 的形式,其中 AA 和 BB 是任意非空字符串,则我们称该字符串的这种拆 分是优秀的.例如,对于字符串 aabaabaa,如果令 A=aabA=aa ...
- 并不对劲的bzoj4650:loj2083:uoj219:p1117:[NOI2016]优秀的拆分
题目大意 "优秀的拆分"指将一个字符串拆分成AABB的形式 十次询问,每次给出一个字符串S(\(|S|\leq3*10^4\)),求它的所有子串的优秀的拆分的方案数之和 题解 此题 ...
- 字符串(后缀自动机):NOI 2016 优秀的拆分
[问题描述] 如果一个字符串可以被拆分为 AABB 的形式,其中 A 和 B 是任意非空字符串, 则我们称该字符串的这种拆分是优秀的. 例如,对于字符串 aabaabaa,如果令 A = aab, B ...
- UOJ#219. 【NOI2016】优秀的拆分 [后缀数组 ST表]
#219. [NOI2016]优秀的拆分 题意:求有多少AABB样子的子串,拆分不同的同一个子串算多个 一开始一直想直接求,并不方便 然后看了一眼Claris的题解的第一行就有思路了 如果分开,求\( ...
- [BZOJ]4650: [Noi2016]优秀的拆分
Time Limit: 30 Sec Memory Limit: 512 MB Description 如果一个字符串可以被拆分为 AABBAABB 的形式,其中 AA 和 BB 是任意非空字符串, ...
随机推荐
- Serverless 在 SaaS 领域的最佳实践
作者 | 计缘 来源 | Serverless 公众号 随着互联网人口红利逐渐减弱,基于流量的增长已经放缓,互联网行业迫切需要找到一片足以承载自身持续增长的新蓝海,产业互联网正是这一宏大背景下的新趋势 ...
- bzoj4821 && luogu3707 SDOI2017相关分析(线段树,数学)
题目大意 给定n个元素的数列,每一个元素有x和y两种元素,现在有三种操作: \(1\ L\ R\) 设\(xx\)为\([l,r]\)的元素的\(x_i\)的平均值,\(yy\)同理 求 \(\fra ...
- Go语言核心36讲(Go语言基础知识五)--学习笔记
05 | 程序实体的那些事儿(中) 在前文中,我解释过代码块的含义.Go 语言的代码块是一层套一层的,就像大圆套小圆. 一个代码块可以有若干个子代码块:但对于每个代码块,最多只会有一个直接包含它的代码 ...
- 来说说JPA、Hibernate、Spring Data JPA之间的什么关系?
目录 JPA Hibernate Spring Data JPA 实践 来说说JPA.Hibernate.Spring Data JPA之间的什么关系 Java 持久层框架访问数据库的方式大致分为两种 ...
- javascript-jquery对象的事件处理
一.页面加载 1.页面加载顺序:先加载<head></head>之间的内容,然后加载<body></body>之间的内容 直接在head之间书写jque ...
- bash反弹shell
part1:不求甚解的本地复现 攻击端Debian 10.x: 192.168.208.134 受害端Ubuntu : 192.168.208.135 攻击端打开(监听)某端口: 键入命令:[nc ...
- 【数据结构与算法Python版学习笔记】图——强连通分支
互联网 我们关注一下互联网相关的非常巨大图: 由主机通过网线(或无线)连接而形成的图: 以及由网页通过超链接连接而形成的图. 网页形成的图 以网页(URI作为id)为顶点,网页内包含的超链接作为边,可 ...
- better-scroll快速上手及封装(vue项目)
愿你有诗有梦,有坦荡荡的远方 本文声明:这是一篇学习coderwhy老师的vue2课程的一个笔记,所以本文章是在vue项目中实现,没学过vue的大佬们可以举一反三. 使用场景及介绍 BetterScr ...
- OO_JAVA_表达式求导
OO_JAVA_表达式求导_第一弹 ---------------------------------------------------表达式提取部分 词法分析 首先,每一个表达式内部都存在不可 ...
- 上午小测1 T1 木板 题解
前言: WTCL,居然折磨煎蛋的性质都忘记了,WTCL. 考场上想出来了正解,就差一点就能A掉,挺难受的. 要记住一个数n可能会有一个大于\(\sqrt{n}\)的质因子..我忘记把它加进去了.... ...