Scau 8633 回文划分 mancher + dp
时间限制:1000MS 内存限制:1000K
提交次数: 通过次数: 题型: 编程题 语言: G++;GCC Description 我们说一个字符串是回文串,那么意味着这个串从两边读起来的字母都是一样的。例如racecar是回文串,
然而fastcar则不是。
对一个串的划分意思是将一个串划分为若干个部分。例如,racecar可以划分为race 和car两部分。给出
一个串,要把这个串划分为若干个回文串,那么至少要把这个串划分为多少部分?
例如
'racecar'已经是回文串,划分为1 个部分即可(这个部分就是racecar)。
'fastcar' 需要被划分为七个部分 ('f', 'a', 's', 't', 'c', 'a', 'r')。根据回文串的定义,单个字母也是回文串。
'aaadbccb' 分成可以被分为三个回文串 ('aaa', 'd', 'bccb')。找不到更少的划分方法。 输入格式 输入的第一行是数字T,表示输入文件含有T个CASE。之后有T行,每行有一个长度不大于1000的字
符串,全部由小写字母组成,中间没有空格。 输出格式 对于每个CASE,输出一个数字,表示对该字符串的回文串最小划分。 输入样例 racecar
fastcar
aaadbccb 输出样例 提示 来源 PKKJ @ GIS dp[i]表示前i个字符最少能被划分为回文串的个数 转移就很简单了:dp[i] = min(dp[j - ]) + ; 其中 <= j <= i 并且 (s[j]~s[i])是回文串 直接算复杂度是O(n^),显然不行,可以用mancher预处理出vis[i][j], 表示(s[i]~s[j])是否是回文串 #include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
const int N = ;
char s[N], str[N << ];
bool vis[N][N];
int dp[N], p[N << ], len;
void get(int n)
{
int mx = , id = ;
for(int i = ; i < n; ++i)
{
p[i] = mx > i ? min(p[ * id - i], mx - i) : ;
while(str[i + p[i]] == str[i - p[i]]) p[i]++;
if(i + p[i] > mx) {
mx = i + p[i];
id = i;
}
}
}
void pre(int n)
{
memset(vis, false, sizeof vis);
for(int i = ; i < n; ++i)
{
if(i & ) {
int st = i - ;
int ed = i + ;
int to = i - p[i] + ;
while(st >= to) { vis[st >> ][ed >> ] = true; st -= ; ed += ; }
}else {
int id = i >> ;
vis[id][id] = true;
int st = i - ;
int ed = i + ;
int to = i - p[i] + ;
while(st >= to) { vis[st >> ][ed >> ] = true; st -= ; ed += ; }
}
}
}
void init()
{
int n = ;
str[n++] = '$';
str[n++] = '#';
for(int i = ; i < len; ++i) {
str[n++] = s[i];
str[n++] = '#';
}
str[n] = ;
get(n);
pre(n); }
void solve()
{
dp[] = ;
for(int i = ; i <= len; ++i)
{
dp[i] = 0x3f3f3f3f;
for(int j = ; j <= i; ++j) if(vis[j][i])
dp[i] = min(dp[i], dp[j - ] + );
}
printf("%d\n", dp[len]);
}
int main()
{
int _; scanf("%d", &_);
while(_ --)
{
scanf("%s", s);
len = strlen(s);
init();
solve();
}
return ;
}
Scau 8633 回文划分 mancher + dp的更多相关文章
- scau 8633 回文划分
8633 回文划分 时间限制:1000MS 内存限制:1000K 题型: 编程题 语言: 无限制 Description 我们说一个字符串是回文串,那么意味着这个串从两边读起来的字母都是一样的. ...
- 8633 回文划分(dp)
8633 回文划分 该题有题解 时间限制:1000MS 内存限制:1000K提交次数:169 通过次数:63 题型: 编程题 语言: G++;GCC Description 我们说一个字符串是回 ...
- (最长回文子串 线性DP) 51nod 1088 最长回文子串
输入一个字符串Str,输出Str里最长回文子串的长度. 回文串:指aba.abba.cccbccc.aaaa这种左右对称的字符串. 串的子串:一个串的子串指此(字符)串中连续的一部分字符构成的子(字符 ...
- [BZOJ4044]Virus synthesis 回文自动机的DP
4044: [Cerc2014] Virus synthesis Time Limit: 20 Sec Memory Limit: 128 MB Description Viruses are us ...
- [加强版] Codeforces 835D Palindromic characteristics (回文自动机、DP)
题目链接: https://codeforces.com/contest/835/problem/D 题意: 一个回文串是\(1\)-回文的,如果一个回文串的左半部分和右半部分一样且都是\(k\)-回 ...
- BZOJ 4044 Luogu P4762 [CERC2014]Virus Synthesis (回文自动机、DP)
好难啊..根本不会做..基本上是抄Claris... 题目链接: (bzoj)https://www.lydsy.com/JudgeOnline/problem.php?id=4044 (luogu) ...
- 关于回文串的DP问题
问题1:插入/删除字符使得原字符串变成一个回文串且代价最小 poj 3280 Cheapest Palindrome 题意:给出一个由m中字母组成的长度为n的串,给出m种字母添加和删除花费的代价,求让 ...
- 【GDOI2016模拟3.15】基因合成(回文串+性质+DP)
[GDOI2016模拟3.15]基因合成 题意: 给一个目标串,要求从空串进行最少的操作次数变成目标串,操作有两种: 在串的头或尾加入一个字符. 把串复制一遍后反向接到串的末尾. 因为有回文操作,所以 ...
- 回文串 --- 动态dp UVA 11584
题目链接: https://cn.vjudge.net/problem/34398/origin 本题的大意其实很简单,就是找回文串,大致的思路如下: 1. 确定一个回文串,这里用到了自定义的chec ...
随机推荐
- 【编程之美】2.5 寻找最大的k个数
有若干个互不相等的无序的数,怎么选出其中最大的k个数. 我自己的方案:因为学过找第k大数的O(N)算法,所以第一反应就是找第K大的数.然后把所有大于等于第k大的数取出来. 写这个知道算法的代码都花了2 ...
- LeetCode 283 Move Zeros
Problem: Given an array nums, write a function to move all 0's to the end of it while maintaining th ...
- yii 多模板
main.php: //替换所有模板 //加载文件名为first的模板 // 'theme'=>'theme1', 'components'=>array( ...
- 解决At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this log
pom增加:<dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</art ...
- Maven构建Hadoop Maven构建Hadoop工程
一.安装maven linux eclipse3.6.1 maven安装 二:官网依赖库 我们可以直接去官网查找我们需要的依赖包的配置pom,然后加到项目中. 官网地址:http://mvnrepos ...
- hdu 2057 A+B
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2057 For each test case,print the sum of A and B in h ...
- LR性能指标分析
Memory: ·Available Mbytes 简述:可用物理内存数.如果Available Mbytes的值很小(4 MB或更小),则说明计算机上总的内存可能不足,或某程序没有释放内存. 参考值 ...
- SQLServer系统监控
http://blog.sina.com.cn/s/blog_519d269c0100gx09.html http://blog.csdn.net/qxlwuyuhui0801/article/det ...
- 【jquery】 【jQuery技术内幕】阅读笔记 一
jQuery( object ) jquery在构造对象时,除了可以用十分好用的css选择器来查找DOM,还可以传入一个javascript对象来生成一个jquery对象. // JS var foo ...
- 用PHPcms V9四步完成WAP手机站搭建
用PHPCMS最新发布的V9搭建了ONOW中文网,WEB网站(www.onow.cn)完成后,有用户提供手机访问的问题, 于是着手搭建ONOW手机WAP站(3g.onow.cn). 用PHPCMS V ...