JZOJ 4752.字符串合成
\(\text{Problem}\)


\(\text{Solution}\)
最优解一定是一个回文子串的最优构造加上剩下的逐个填入
考虑用回文树建出所有的回文串,然后 \(dp\) 求回文子串最优的构造方案
维护一个 \(\text{half}\) 意义同 \(\text{fail}\),但要保证长度不超过 \(len\) 的一半且最大
暴力跳 \(\text{fail}\) 发现不行
加上一个小 \(\text{trick}\):倒着做,用 \(x\) 的 \(\text{half}\) 更新 \(\text{fail[x]}\) 的 \(\text{half}\)
正确性显然
\(\text{Code}\)
#include <cstdio>
#include <cstring>
#include <iostream>
#define re register
using namespace std;
const int N = 1e5 + 5;
int T, Len;
char str[N];
struct PAM{
int size, last, tot, tr[N][26], fail[N], half[N], len[N], f[N], fa[N];
char s[N];
inline int Node(int l)
{
++size, memset(tr[size], 0, sizeof tr[size]);
len[size] = l, fail[size] = half[size] = 0;
return size;
}
inline void clear()
{
size = -1, s[last = tot = 0] = '$';
Node(0), Node(-1), fail[0] = 1;
memset(f, 0, sizeof f), f[0] = 1;
}
inline int getfail(int x)
{
while (s[tot - len[x] - 1] != s[tot]) x = fail[x];
return x;
}
inline void insert(char c)
{
s[++tot] = c;
int cur = getfail(last), ch = c - 'a';
if (!tr[cur][ch])
{
int u = Node(len[cur] + 2);
fail[u] = tr[getfail(fail[cur])][ch], fa[u] = cur, tr[cur][ch] = u;
}
last = tr[cur][ch];
}
inline void gethalf()
{
for(re int i = 2; i <= size; i++) half[i] = fail[i];
for(re int i = size; i >= 2; i--)
{
while ((len[half[i]] << 1) > len[i]) half[i] = fail[half[i]];
if (len[half[i]] < len[half[fail[i]]]) half[fail[i]] = half[i];
}
}
inline int dp()
{
int ans = Len;
for(re int i = 2; i <= size; i++)
{
if (len[i] & 1) f[i] = min(f[fa[i]] + 2, f[fail[i]] + len[i] - len[fail[i]]);
else f[i] = min(f[fa[i]] + 1, f[half[i]] + (len[i] >> 1) - len[half[i]] + 1);
ans = min(ans, f[i] + Len - len[i]);
}
return ans;
}
}P;
int main()
{
scanf("%d", &T);
for(; T; --T)
{
P.clear();
scanf("%s", str + 1);
Len = strlen(str + 1);
for(re int i = 1; i <= Len; i++) P.insert(str[i]);
P.gethalf();
printf("%d\n", P.dp());
}
}
JZOJ 4752.字符串合成的更多相关文章
- [JZOJ 5129] 字符串
题意:统计本质不同的串的个数. 思路: 显然后缀自动机,对于每个串建一个\(SAM\)统计即可. #include <bits/stdc++.h> using namespace std; ...
- Add Binary字符数字相加,字符串合成
Given two binary strings, return their sum (also a binary string). For example,a = "11"b = ...
- Python中常见字符串去除空格的方法总结
Python中常见字符串去除空格的方法总结 1:strip()方法,去除字符串开头或者结尾的空格>>> a = " a b c ">>> a.s ...
- Python处理字符串和列表元组的小技巧
变量值互换 a = 1 b = 100 # 变量值互换 a, b = b, a print('a:', a) print('b:', b) 输出结果: a: 100 b: 1 多个变量赋值 a, b, ...
- Torch7学习笔记(一)CmdLine
该类主要为了提供一种方便解析参数的框架,对于每个实验尤其是神经网络中要调参数上.同时还可以把输出重定向到log文件中. 一般用法: cmd = torch.CmdLine() cmd:text() c ...
- Python 学习---------Day2
第四章 介绍Python对象类型为什么使用内置类型 内置对象使程序更容易编写 内置对象是拓展的组件 内置对象往往比定制的数据结构更有效率 内置对象是语言标准的一部分Python的核心数据类型 数字 字 ...
- JavaScript——exec和match
题目17:Read the following javascript code: var someText="web2.0 .net2.0";var pattern=/(\w+)( ...
- C#文件系统管理
目录 前言 Directory类和DirectoryInfo类 File类和FileInfo类 Path类 前言 管理文件系统主要是对计算机中文件和目录的管理,例如,读取文件信息.删除文件和读取目录信 ...
- JS中exec函数与match函数的区别与联系
总结: 正则规则的声明,两种方法: exec是RegExp类的匹配方法 match是字符串类的匹配方法 var reg = /aaa/g; var reg = new RegExp("aaa ...
- 科大讯飞和Tizen-TTS语音合成引擎
最近在做一个文本转语音TTS(Text to Speech)的第三方软件封装,使用的是国内语音技术龙头安徽科大讯飞公司提供的离线引擎AiSound5.0,主要用于汽车导航用途.科大讯飞还提供 了AiT ...
随机推荐
- [论文阅读] 颜色迁移-N维pdf迁移
[论文阅读] 颜色迁移-N维pdf迁移 文章: N-Dimensional Probability Density Function Transfer and its Application to C ...
- 解决 linux mint 安装显卡驱动失败解决
前言 安装显卡驱动的基本流程就是,禁用 nouveau驱动,然后安装 nnvidia驱动,然后重启电脑.但是我重新启动, 使用NVIDIA X Server Settings查看一直显示空白,毫无疑问 ...
- JavaEE Day07 HTML
今日内容 Web概念概述 HTML 一.Web概念概述 1. JavaWeb:使用Java语言开发的基于互联网的项目 2.软件架构 C/S架构:Client/Server--- 客户端/服务器端(安卓 ...
- 【Java EE】Day08 HTML&CSS
一.表单 1.概述 采集数据,与服务器交互包括 form表单,需要提交则必须设置name属性,action方式主要包 get:参数会在地址栏显示(请求行),长度有限 post:参数被封装在请求体,参数 ...
- MySQL空间暴涨150G导致锁定,发生了什么
背景 12月1号中午突然收到大量报警,某客户环境操作数据库大量失败,报错信息如下图所示: 这个报错我是第一次见,一时间有点无所适从,但是从字面意思来看是MySQL目前处于LOCK_WRITE_GROW ...
- @ApiImplicitParams注解的详细使用
一.@ApiImplicitParams注解的详细使用 业务需求: 1.根据服务员类别id(单个id)+服务员星级id(id的list)查询对应的服务员列表 1.controller代码: 点击查看代 ...
- vue 组件之间传值(父传子,子传父)
1.父传子 基本就用一个方式,props Father.vue(用v-bind(简写 : ) 将父组件传的值绑定到子组件上) <template> <div> 我是爸爸:{{ ...
- 2022的ShellCTF之web_WP
Extractor: 考点是SQL注入,不过数据库不是mysql,而是sqlite 首先尝试了:1' or 1=1# 尝试1' or 1=1 -- 发现有东西,使用 :order by 判断列表,知道 ...
- [python]《Python编程快速上手:让繁琐工作自动化》学习笔记5
1. 处理CSV文件笔记(第14章) (代码下载) 本文主要在python下介绍CSV文件,CSV 表示"Comma-Separated Values(逗号分隔的值)",CSV文件 ...
- [随笔所想] CSDN认证博客专家申请通过随笔所想
本篇博客写于2020年5月13日晚,为了纪念CSDN博客专家申请通过. 2020年5月10日晚,也就是2020年的母亲节当晚提交了博客专家申请.在2020年5月13日上午,就知道博客专家申请通过啦!前 ...