[NOI.AC] palindrome
思路:
\(50pts\)
\(f[l,r]\)表示区间\([l,r]\)能够变成多少个串,转移枚举\(l\),利用\(hash\)判字符串相等。
复杂度\(O(Tn^3)\)
\(70pts\)
考虑优化,发现\(f[1,n]\)的贡献来源于每个\(f[i,n - i + 1]\),所以dp过程降低复杂度为\(O(Tn^2)\)。
\(100pts\)
枚举\(border\)每次贪心的砍\(border\),被卡单\(hash\)一脸不爽\(.jpg\)
不过判相等如果泥工\(kmp\),恭喜你,贪心和没贪一样,因为复杂度还是\(O(n^2)\)
复杂度\(O(Tn)\)
#include <bits/stdc++.h>
using namespace std;
const int bse1 = 29;
const int bse2 = 33;
const int mod1 = 1e9+7;
const int mod2 = 1e9+9;
#define ull unsigned long long
const int maxn = 10000010;
char s[maxn];
ull hsh[maxn][2];
ull pw1[maxn];
ull pw2[maxn];
int T;
inline void pre () {
pw1[0] = pw2[0] = 1;
for(int i = 1;i < maxn; ++i) {
pw1[i] = pw1[i - 1] * bse1 % mod1;
pw2[i] = pw2[i - 1] * bse2 % mod2;
}
}
inline ull cal1(int l,int r) {
return (hsh[r + 1][0] - hsh[l][0] * pw1[r - l + 1] % mod1 + mod1) % mod1;
}
inline ull cal2(int l,int r) {
return (hsh[r + 1][1] - hsh[l][1] * pw2[r - l + 1] % mod2 + mod2) % mod2;
}
inline bool check(int x,int y,int l,int r) {
return cal1(x,y) == cal1(l,r) && cal2(x,y) == cal2(l,r);
}
inline int solve(int l,int r) {
if(l > r) return 0;
for(int i = l;i < (r - (i - l)); ++i) {
if(check(l,i,(r - (i - l)),r)) {
return solve(i + 1,r - (i - l) - 1) + 2;
}
}
return 1;
}
int main () {
pre();
scanf("%d",&T);
while(T--) {
scanf("%s",s);
int len = strlen(s);
for(int i = 0;i < len; ++i) {
hsh[i + 1][0] = (hsh[i][0] * bse1 + s[i] - 'a') % mod1;
hsh[i + 1][1] = (hsh[i][1] * bse2 + s[i] - 'a') % mod2;
}
printf("%d\n",solve(0,len - 1));
}
return 0;
}
[NOI.AC] palindrome的更多相关文章
- NOI.AC NOIP模拟赛 第二场 补记
NOI.AC NOIP模拟赛 第二场 补记 palindrome 题目大意: 同[CEOI2017]Palindromic Partitions string 同[TC11326]Impossible ...
- # NOI.AC省选赛 第五场T1 子集,与&最大值
NOI.AC省选赛 第五场T1 A. Mas的童年 题目链接 http://noi.ac/problem/309 思路 0x00 \(n^2\)的暴力挺简单的. ans=max(ans,xor[j-1 ...
- NOI.ac #31 MST DP、哈希
题目传送门:http://noi.ac/problem/31 一道思路好题考虑模拟$Kruskal$的加边方式,然后能够发现非最小生成树边只能在一个已经由边权更小的边连成的连通块中,而树边一定会让两个 ...
- NOI.AC NOIP模拟赛 第五场 游记
NOI.AC NOIP模拟赛 第五场 游记 count 题目大意: 长度为\(n+1(n\le10^5)\)的序列\(A\),其中的每个数都是不大于\(n\)的正整数,且\(n\)以内每个正整数至少出 ...
- NOI.AC NOIP模拟赛 第六场 游记
NOI.AC NOIP模拟赛 第六场 游记 queen 题目大意: 在一个\(n\times n(n\le10^5)\)的棋盘上,放有\(m(m\le10^5)\)个皇后,其中每一个皇后都可以向上.下 ...
- NOI.AC NOIP模拟赛 第一场 补记
NOI.AC NOIP模拟赛 第一场 补记 candy 题目大意: 有两个超市,每个超市有\(n(n\le10^5)\)个糖,每个糖\(W\)元.每颗糖有一个愉悦度,其中,第一家商店中的第\(i\)颗 ...
- NOI.AC NOIP模拟赛 第四场 补记
NOI.AC NOIP模拟赛 第四场 补记 子图 题目大意: 一张\(n(n\le5\times10^5)\)个点,\(m(m\le5\times10^5)\)条边的无向图.删去第\(i\)条边需要\ ...
- NOI.AC NOIP模拟赛 第三场 补记
NOI.AC NOIP模拟赛 第三场 补记 列队 题目大意: 给定一个\(n\times m(n,m\le1000)\)的矩阵,每个格子上有一个数\(w_{i,j}\).保证\(w_{i,j}\)互不 ...
- NOI.AC WC模拟赛
4C(容斥) http://noi.ac/contest/56/problem/25 同时交换一行或一列对答案显然没有影响,于是将行列均从大到小排序,每次处理限制相同的一段行列(呈一个L形). 问题变 ...
随机推荐
- 【性能-windows端口限制】TPS上不去,应用无压力只有cpu5%,tomcat线程最高1500,增大并发出现connect 报错
现象:TPS上不去,应用无压力只有cpu5%,tomcat线程够用最高1500,增大并发出现connect 报错 原因:windows端口不够用了,或者不够回收了 解决方案: 1.运行-regedit ...
- getElementsBy 系列方法相比querySelector系列的区别
最近在做的项目中,使用querySelectorAll获取了同class名的元素后,绑定onmouseover事件和onmouseout后,多次在几个元素上移入移出操作时,控制台出现了报错的问题,最后 ...
- 【NIO】IO与NIO的区别
一.概念 NIO即New IO,这个库是在JDK1.4中才引入的.NIO和IO有相同的作用和目的,但实现方式不同,NIO主要用到的是块,所以NIO的效率要比IO高很多.在Java API中提供了两套N ...
- thinkphp 常量参考
预定义常量 预定义常量是指系统内置定义好的常量,不会随着环境的变化而变化,包括: URL_COMMON 普通模式 URL (0) URL_PATHINFO PATHINFO URL (1) URL_R ...
- Android中父View和子view的点击事件的执行过程
Android中的事件类型分为按键事件和屏幕触摸事件,Touch事件是屏幕触摸事件的基础事件,有必要对它进行深入的了解. 一个最简单的屏幕触摸动作触发了一系列Touch事件:ACTION_DOWN- ...
- vue2 开发环境部署 及 打包配置
一.脚手架工具(vue2 的脚手架工具是 vue-cli) 1.脚手架工具的安装 参考 : https://blog.csdn.net/wulala_hei/article/details/804 ...
- docker哪些平台技术(3)
容器平台技术 容器核心技术使得容器能够在单个 host 上运行.而容器平台技术能够让容器作为集群在分布式环境中运行. 容器平台技术包括容器编排引擎.容器管理平台和基于容器的 PaaS. 容器编排引擎 ...
- monkeyrunner 进行多设备UI测试
monkeyrunner进行多设备UI测试 首先你要连接好多个手机设置好已经连接好的手机的ip列表ipp = ['192xxx','192xxx']杀掉之前所有appium进程subprocess. ...
- CSS实现背景图片固定
body { background-image:url('bg.jpg'); background-repeat: no-repeat; background-attachment: fixed; / ...
- centos7下利用nfs搭建wordpress
拓扑环境 web1 192.168.198.110 web2 192.168.198.120 mysql 192.168.198.130 DNS 192.168.198.10 NFS 192.168. ...