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 ...
随机推荐
- 【python】为什么修改全局的dict变量不用global关键字
转自:http://my.oschina.net/leejun2005/blog/145911?fromerr=qnPCgI19#OSC_h4_8 为什么修改字典d的值不用global关键字先声明呢? ...
- Spring控制反转与依赖注入(IOC、DI)
IOC: 反转控制 Inverse Of Control DI:依赖注入 Dependency Injection 目的:完成程序的解耦合 解释:在应用系统的开发过程中,有spring负责对象的创 ...
- Struts2防止表单重复提交
1.说明 系统拦截器的应用. 表单重复提交:当使用请求转化进行跳转的时候,存在着表单重复提交的问题. 2.在表单中加入s:token 如果页面加入了struts2的标签,页面的请求必须进入struts ...
- 关于 UICollectionViewCell 的一些陷阱
如果直接使用 UICollectionViewCell 的自带属性 selected 来自定义一些样式,如: - (void)setSelected:(BOOL)selected { [super s ...
- Ubuntu gcc编译报错:format ‘%llu’ expects argument of type ‘long long unsigned int’, but argument 2 has type ‘__time_t’ [-Wformat=]
平时用的都是Centos系统,今天偶然在Ubuntu下编译了一次代码,发现报错了: 源码: #include <stdio.h> #include <sys/time.h> # ...
- httpclient 支持代理和http & https
import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.Inpu ...
- 10.11 cocoapods安装
手动安装gem 手动下载 rubygem https://rubygems.org/pages/download#formats 10.11 cocoapods安装 sudo gem install ...
- Java之POJO
转: POJO 一:什么是POJOPOJO的名称有多种,pure old java object .plain ordinary java object 等.按照Martin Fowler的解释 ...
- JavaWeb学习之JSP常用标签、EL表达式的运算符、JSTL标签库(6)
1.JSP常用标签 * 只要支持JSP文件,常用标签有可以直接使用 * 格式: jsp:xxxx * jsp:forward ,完成jsp页面的转发 * page属性:转发的地址 <% requ ...
- HTML5学习之拖放(十)
l元素可以用于拖拽必须设置draggable="true"属性,img和a标签除外,她们两个默认就可以被拖拽 想做拖拽处理,就需要在Dom元素上监听拖放的事件:dragstart, ...