[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形). 问题变 ...
随机推荐
- dubbo管理平台安装
dubbo-admin.war可在网上百度去下载,但是我下载了好几个,发布上去服务启动都报错,这个时候大概是我们系统的JDK和编译dubbo-admin.war的JDK版本不同导致的了,强烈建议自己下 ...
- safari浏览器中获取指定时间的毫秒数
最近在项目中,发现时间转换,在firefox和chrome中可以正确的显示,但是在Safari中显示NaN.在网上查了下,发现Safari不支持 YYYY-MM-DD HH:MM:SS 这个时间格式, ...
- qt中使用sqlite存储数据
一.sqilte的安装 在Windows上安装SQLite: 请访问 SQLite 下载页面,从 Windows 区下载预编译的二进制文件. 您需要下载 sqlite-tools-win32-*.zi ...
- luoguP1288 取数游戏II [博弈论]
题目描述 有一个取数的游戏.初始时,给出一个环,环上的每条边上都有一个非负整数.这些整数中至少有一个0.然后,将一枚硬币放在环上的一个节点上.两个玩家就是以这个放硬币的节点为起点开始这个游戏,两人轮流 ...
- js设计模式——8.中介者模式
js设计模式——8.中介者模式 /*js设计模式——中介者模式*/ class A { constructor() { this.number = 0; } setNumber(num, m) { t ...
- Arduino与水泵实验+土壤湿度传感器
1 水泵实验我们这里是使用的继电器控制的水泵,注意再实验的时候电池的电压不要超过6v,太大容易烧毁水泵,如果是长时间的使用水泵,要注意将水泵放入水中,这样可以达到给水泵降温的效果.1.全新5V继电器模 ...
- Golang 标准库log的实现
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://gotaly.blog.51cto.com/8861157/1406905 前 ...
- 训练集(train set) 验证集(validation set) 测试集(test set)。
训练集(train set) 验证集(validation set) 测试集(test set). http://blog.sina.com.cn/s/blog_4d2f6cf201000cjx.ht ...
- Appium 工作原理
Appium - automation for mobile apps 一.Appium架构介绍 官网:www.appium.io 由SauceLab公司主持.并在Google的GATC2013会 ...
- hexo的next主题博客中加入分类页面的js,实现多级目录,并且能够点击展开,隐藏下级目录~(不知道算不算深度优化~~~)
个人博客:https://mmmmmm.me 源码:https://github.com/dataiyangu/dataiyangu.github.io 多级标题 在自己的xxxx.md文件中做如下修 ...