思路:

\(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的更多相关文章

  1. NOI.AC NOIP模拟赛 第二场 补记

    NOI.AC NOIP模拟赛 第二场 补记 palindrome 题目大意: 同[CEOI2017]Palindromic Partitions string 同[TC11326]Impossible ...

  2. # NOI.AC省选赛 第五场T1 子集,与&最大值

    NOI.AC省选赛 第五场T1 A. Mas的童年 题目链接 http://noi.ac/problem/309 思路 0x00 \(n^2\)的暴力挺简单的. ans=max(ans,xor[j-1 ...

  3. NOI.ac #31 MST DP、哈希

    题目传送门:http://noi.ac/problem/31 一道思路好题考虑模拟$Kruskal$的加边方式,然后能够发现非最小生成树边只能在一个已经由边权更小的边连成的连通块中,而树边一定会让两个 ...

  4. NOI.AC NOIP模拟赛 第五场 游记

    NOI.AC NOIP模拟赛 第五场 游记 count 题目大意: 长度为\(n+1(n\le10^5)\)的序列\(A\),其中的每个数都是不大于\(n\)的正整数,且\(n\)以内每个正整数至少出 ...

  5. NOI.AC NOIP模拟赛 第六场 游记

    NOI.AC NOIP模拟赛 第六场 游记 queen 题目大意: 在一个\(n\times n(n\le10^5)\)的棋盘上,放有\(m(m\le10^5)\)个皇后,其中每一个皇后都可以向上.下 ...

  6. NOI.AC NOIP模拟赛 第一场 补记

    NOI.AC NOIP模拟赛 第一场 补记 candy 题目大意: 有两个超市,每个超市有\(n(n\le10^5)\)个糖,每个糖\(W\)元.每颗糖有一个愉悦度,其中,第一家商店中的第\(i\)颗 ...

  7. NOI.AC NOIP模拟赛 第四场 补记

    NOI.AC NOIP模拟赛 第四场 补记 子图 题目大意: 一张\(n(n\le5\times10^5)\)个点,\(m(m\le5\times10^5)\)条边的无向图.删去第\(i\)条边需要\ ...

  8. NOI.AC NOIP模拟赛 第三场 补记

    NOI.AC NOIP模拟赛 第三场 补记 列队 题目大意: 给定一个\(n\times m(n,m\le1000)\)的矩阵,每个格子上有一个数\(w_{i,j}\).保证\(w_{i,j}\)互不 ...

  9. NOI.AC WC模拟赛

    4C(容斥) http://noi.ac/contest/56/problem/25 同时交换一行或一列对答案显然没有影响,于是将行列均从大到小排序,每次处理限制相同的一段行列(呈一个L形). 问题变 ...

随机推荐

  1. Java中的时间日期Date和Calendar

    日期时间类 Date: Date类的构造方法: 可以发现Date类的toString方法被重写了. Date类的方法: SimpleDateFormat 它提供了解决Date输出问题的解决方案--格式 ...

  2. Magento多语言注意事项

    Magento一般使用CSV文件方式翻译国际化词条 一般用法是代码中: <?php echo Mage::helper("module_name")->__('Item ...

  3. mac 安装 pymssql 报错

    报错信息 _mssql.c:346:10: fatal error: 'sqlfront.h' file not found #include "sqlfront.h" ^~~~~ ...

  4. 用java打开一个本地文件

    以下有三种方式打开 /** * 借助java.awt.Desktop打开 * @see 打开的目录或文件名中允许包含空格 */ private static void useAWTDesktop() ...

  5. MVC3中_ViewStart.cshtml的一些事

    MVC3中,使用Razor模板引擎的话,会自动生成一个_ViewStart.cshtml文件. 很多人把这个文件当成类似Webform中的Master模板文件,其实这个_ViewStart.cshtm ...

  6. 安装debian总结以及编译linux内核

    1. 安装debian 使用unetbootin(http://unetbootin.sourceforge.net/)来创建启动盘,并且下载debian的基本包. 将磁盘进行压缩操作,并且保留出一个 ...

  7. inode缓存与dentry缓存

    1. inode缓存 1: struct inode { 2: /* RCU path lookup touches following: */ 3: umode_t i_mode; 4: uid_t ...

  8. 【转】HTML5标签使用的常见误区

    最近组内进行 HTML5标签的学习,方法呢就是大家每人挑选几个标签,自己先去学习,然后给大家作讲解.这个过程大家还是挺有收获的.但是现在HTML5还处在草案阶 段,有些新的标签元素的解释也是经常有变化 ...

  9. 真实的『REM』手机屏幕适配

    rem 作为一个低调的长度单位,由于手机端网页的兴起,在屏幕适配中得到重用.使用 rem 前端开发者可以很方便的在各种屏幕尺寸下,通过等比缩放的方式达到设计图要求的效果. rem 的官方定义『The ...

  10. 制作 U 盘启动盘

    制作 U 盘启动盘 这篇文章说的是 U 盘启动盘是如何运作的,同时有一个既能装 Windows 又能装 Linux 的 U 盘启动盘的例子. U 盘启动盘 当按下开机键后,电脑能启动我原本安装的操作系 ...