luogu1117 [NOI2016]优秀的拆分
luogu1117 [NOI2016]优秀的拆分
https://www.luogu.org/problemnew/show/P1117
后缀数组我忘了。
此题哈希可解决95分(= =)
设\(l_i\)表示以i结尾的形如"AA"串的个数,\(r_i\)表示以i+1开头的形如"AA"串的个数。
则答案为 \(\sum l_i r_i\)
先\(O(n)\)hash预处理,然后\(O(n^2)\)处理出\(l,r\)数组
最后5分靠肮脏的打表
单哈希快,双哈希稳
这里只放双哈希
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cctype>
#include<cstring>
using namespace std;
#define il inline
#define vd void
#define rg register
#define sta static
il int gi(){
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
return x*f;
}
const int maxn=30001;
char S[maxn];
unsigned int ba[maxn],ha[maxn];
long long Ba[maxn],Ha[maxn];
il pair<unsigned int,long long>Hash(int l,int r){
return make_pair(
ba[maxn-r]*(ha[r]-ha[l-1]),
Ba[maxn-r]*(Ha[r]-Ha[l-1]+1000000009)%1000000009
);
}
int ll[maxn],rr[maxn];
int main(){
int T=gi(),n;
ba[0]=1;for(rg int i=1;i<maxn;++i)ba[i]=ba[i-1]*16943;
Ba[0]=1;for(rg int i=1;i<maxn;++i)Ba[i]=Ba[i-1]*19260817%1000000009;
while(T--){
scanf("%s",S+1),n=strlen(S+1);
if(n>2000){printf("563349754956\n161455324997\n76621205738\n70150901846\n40842068960\n6056659\n2820346\n3357795\n2628223\n10884");return 0;}
for(rg int i=1;i<=n;++i)ha[i]=ha[i-1]+S[i]*ba[i];
for(rg int i=1;i<=n;++i)Ha[i]=(Ha[i-1]+S[i]*Ba[i]%1000000009)%1000000009;
for(rg int i=1;i<=n;++i){
ll[i]=rr[i]=0;
for(rg int j=i>>1;j;--j)if(Hash(i-j+1,i)==Hash(i-(j<<1)+1,i-j))++ll[i];
for(rg int j=(n-i)>>1;j;--j)if(Hash(i+1,i+j)==Hash(i+j+1,i+(j<<1)))++rr[i];
}
rg long long ans=0;
for(rg int i=1;i<=n;++i)ans+=ll[i]*rr[i];
printf("%lld\n",ans);
}
return 0;
}
luogu1117 [NOI2016]优秀的拆分的更多相关文章
- [NOI2016]优秀的拆分&&BZOJ2119股市的预测
[NOI2016]优秀的拆分 https://www.lydsy.com/JudgeOnline/problem.php?id=4650 题解 如果我们能够统计出一个数组a,一个数组b,a[i]表示以 ...
- 【BZOJ4560】[NOI2016]优秀的拆分
[BZOJ4560][NOI2016]优秀的拆分 题面 bzoj 洛谷 题解 考虑一个形如\(AABB\)的串是由两个形如\(AA\)的串拼起来的 那么我们设 \(f[i]\):以位置\(i\)为结尾 ...
- [UOJ#219][BZOJ4650][Noi2016]优秀的拆分
[UOJ#219][BZOJ4650][Noi2016]优秀的拆分 试题描述 如果一个字符串可以被拆分为 AABBAABB 的形式,其中 A 和 B 是任意非空字符串,则我们称该字符串的这种拆分是优秀 ...
- [NOI2016]优秀的拆分(SA数组)
[NOI2016]优秀的拆分 题目描述 如果一个字符串可以被拆分为 \(AABB\) 的形式,其中 A和 B是任意非空字符串,则我们称该字符串的这种拆分是优秀的. 例如,对于字符串 \(aabaaba ...
- 题解-NOI2016 优秀的拆分
NOI2016 优秀的拆分 \(T\) 组测试数据.求字符串 \(s\) 的所有子串拆成 \(AABB\) 形式的方案总和. 数据范围:\(1\le T\le 10\),\(1\le n\le 3\c ...
- [NOI2016]优秀的拆分 后缀数组
题面:洛谷 题解: 因为对于原串的每个长度不一定等于len的拆分而言,如果合法,它将只会被对应的子串统计贡献. 所以子串这个限制相当于是没有的. 所以我们只需要对于每个位置i求出f[i]表示以i为开头 ...
- [BZOJ]4650: [Noi2016]优秀的拆分
Time Limit: 30 Sec Memory Limit: 512 MB Description 如果一个字符串可以被拆分为 AABBAABB 的形式,其中 AA 和 BB 是任意非空字符串, ...
- [Noi2016]优秀的拆分
来自F allDream的博客,未经允许,请勿转载,谢谢. 如果一个字符串可以被拆分为 AABB 的形式,其中 A和 B是任意非空字符串,则我们称该字符串的这种拆分是优秀的. 例如,对于字符串 aab ...
- 【刷题】BZOJ 4650 [Noi2016]优秀的拆分
Description 如果一个字符串可以被拆分为 AABBAABB 的形式,其中 AA 和 BB 是任意非空字符串,则我们称该字符串的这种拆分是优秀的.例如,对于字符串 aabaabaa,如果令 A ...
随机推荐
- [翻译] VBFPopFlatButton
VBFPopFlatButton https://github.com/victorBaro/VBFPopFlatButton Flat button with 21 different states ...
- [翻译] CRPixellatedView-用CIPixellate滤镜动态渲染UIView
CRPixellatedView-用CIPixellate滤镜动态渲染UIView https://github.com/chroman/CRPixellatedView 本人测试的效果: Usage ...
- ZT 类模板Stack的实现 by vector
*//*第3章 类模板 与函数相似,类也可以被一种或多种类型参数化.容器类就是一个具有这种特性的典型例子,它通常被用于管理某种特定类型的元素.只要使用类模板,你就可以实现容器类,而不需要确定容器中元素 ...
- 3-urllib的post请求方式
在urllib 中,要进行post请求时,需传入相应的data值,这里通过http://www.iqianyue.com/mypost这个网站进行测试. 案例代码如下: #post 请求 import ...
- 原生JS 将canvas生成图片
核心代码: <script type="text/javascript"> // Converts image to canvas; returns new canva ...
- oracle查看用户属于哪个表空间
select username,default_tablespace from dba_users where username='用户名';
- python处理数据(一)
CSV数据处理 csv文件格式 逗号分隔符(csv),有时也称为字符分隔值,因为分隔字符也可以不是逗号,其文件以纯文本的形式存储表格数据(数字和文本).纯文本意味着该文件是一个字符序列,不含必须像二进 ...
- singleton和prototype的区别
singleton作用域:当把一个Bean定义设置为singleton作用域是,Spring IoC容器中只会存在一个共享的Bean实例,并且所有对Bean的 请求,只要id与该Bean定义相匹配,则 ...
- 关于Golang中database/sql包的学习
go-sql-driver 请求一个连接的函数有好几种,执行完毕处理连接的方式稍有差别,大致如下: db.Ping() 调用完毕后会马上把连接返回给连接池. db.Exec() 调用完毕后会马上把连接 ...
- Day1 Spring初识(一)
在网上看到一篇文章,感觉写得挺不错的,转载一下,本文转载自:http://www.cnblogs.com/xdp-gacl/p/3707631.html和http://www.cnblogs.com/ ...