[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 | 一文详解 Serverless 技术选型
作者 | 李国强 阿里云资深产品专家 今天来讲,在 Serverless 这个大领域中,不只有函数计算这一种产品形态和应用类型,而是面向不同的用户群体和使用习惯,都有其各自适用的 Serverless ...
- WIN10下的VMware与Docker冲突的解决方案
VMARE版本升级到15.5以上 WIN10升级到2004版本以上 Hyper-V为开启状态
- 洛谷4219 BJOI2014大融合(LCT维护子树信息)
QWQ 这个题目是LCT维护子树信息的经典应用 根据题目信息来看,对于一个这条边的两个端点各自的\(size\)乘起来,不过这个应该算呢? 我们可以考虑在LCT上多维护一个\(xv[i]\)表示\(i ...
- L1-027 出租 (20 分) java题解
下面是新浪微博上曾经很火的一张图: 一时间网上一片求救声,急问这个怎么破.其实这段代码很简单,index数组就是arr数组的下标,index[0]=2 对应 arr[2]=1,index[1]=0 对 ...
- app定位工具介绍
一.元素获取工具WEditor使用 1.安装WEditor:pip3 install weditor 2.启动WEditor:python3 -m weditor Android : ...
- Spark解决SQL和RDDjoin结果不一致问题(工作实录)
问题描述:DataFrame的join结果不正确,dataframeA(6000无重复条数据) join dataframeB(220条无重复数据,由dataframeA转化而来,key值均源于dat ...
- UltraSoft - Alpha - Scrum Meeting 5
Date: Apr q9th, 2020. Scrum 情况汇报 进度情况 组员 负责 昨日进度 后两日任务 CookieLau PM 统筹个人进度,协助推进进度 辅助前后端连接工作 刘zh 前端 完 ...
- 一套比较好用的公众号UI框架-weui
最近工作原因 需要在pd端弄一套js类似bootstrap框架 由于使用环境是在公众号终端用的比较多! 类似上面这样的样式 所以我从微信官方开始找起 最后找到了WEUI 还别说 真的挺好用的 这是大佬 ...
- dfs初步模板解析
#include<stdio.h> int a[10],book[10],n; //这里还有需要注意的地方C语言全局变量默认为0 void dfs(int step){ //此时在第ste ...
- FastAPI 学习之路(五十九)封装统一的json返回处理工具
这之前的接口,我们返回的格式都是每个接口异常返回的数据格式都会不一样,我们处理起来没有那么方便,我们可以封装一个统一的json处理. 那么我们看下如何来实现呢 from fastapi import ...