CF1131E String Multiplication(???)
这题难度2200,应该值了。
题目链接:CF原网
题目大意:定义两个字符串 $s$ 和 $t$($s$ 的长度为 $m$)的乘积为 $t+s_1+t+s_2+\dots+t+s_m+t$。定义一个字符串的美丽度为最长的相同字母连续子序列的长度。现在给出 $n$ 个字符串 $p_i$,问 $((p_1p_2)p_3)\dots p_n$ 的美丽度。
$1\le n\le 10^5,\sum|p_i|\le 10^5$。
官方题解讲的很复杂,但看起来也就是个暴力大模拟,跟我的做法差不多。
为叙述方便,令 $P_i=((p_1p_2)p_3)\dots p_i$。
我们现在考虑如何从 $P_{i-1}$ 转移到 $P_i$。
对于每个 $P_i$,我们维护 $s[i][c]$ 表示 $P_i$ 中最长的连续 $c$ 的长度。
先不考虑乘法,将 $s[i][c]$ 设为 $p_i$ 中的连续长度。
定义 $lc$ 为 $p_i$ 最长的连续字母前缀,$rc$ 为最长的连续字母后缀。
首先如果 $p_i$ 的首尾字母不相同,那么 $s[i][{p_i}_1]$ 就可以从 $lc+[P_{i-1}\text{中出现过}{p_i}_1]$ 更新(接在原来字符的后面组成)。$s[i][{p_i}_{|p_i|}]$ 同理。
否则如果 $p_i$ 不由相同字母构成,那么:
- 如果 $P_i$ 中出现过 ${p_i}_1$,$s[i][{p_i}_1]$ 就可以从 $lc+rc+1$ 更新。(前缀接在这个字符后面,前一个后缀接在这个字符前面)
- 否则,$s[i][{p_i}_1]$ 就可以从 $\max(lc,rc)$ 更新,这不会更优,可以省略。
否则,就可以把 $s[i-1][{p_i}_1]$ 个 ${p_i}_1$ 拿出来,前后接上 $p_i$,那么 $s[i][{p_i}_1]$ 就可以从 $|p_i|(s[i-1][{p_i}_1]+1)+s[i-1][{p_i}_1]$ 更新。
注意最后 $P_{i-1}$ 会被拆成一个个字符,他们对 $s[i]$ 的贡献就是每个字符有没有出现过,而不是出现次数。
最后所有 $s[n][c]$ 的最大值就是答案。
时间复杂度 $O(\sum |p_i|)$。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> PII;
const int maxn=;
#define MP make_pair
#define PB push_back
#define lson o<<1,l,mid
#define rson o<<1|1,mid+1,r
#define FOR(i,a,b) for(int i=(a);i<=(b);i++)
#define ROF(i,a,b) for(int i=(a);i>=(b);i--)
#define MEM(x,v) memset(x,v,sizeof(x))
inline int read(){
char ch=getchar();int x=,f=;
while(ch<'' || ch>'') f|=ch=='-',ch=getchar();
while(ch>='' && ch<='') x=x*+ch-'',ch=getchar();
return f?-x:x;
}
int n,cont[][],s[];
char str[maxn];
inline void chkmax(int &x,int y){
if(y>x) x=y;
}
int main(){
n=read();
FOR(nn,,n){
scanf("%s",str+);
int len=strlen(str+);
int cnt=;
FOR(i,,len)
if(str[i]!=str[i+]){
chkmax(cont[nn][str[i]-'a'],cnt);
cnt=;
}
else cnt++;
int lcnt=,rcnt=;
FOR(i,,len){
if(str[i]==str[]) lcnt++;
else break;
}
ROF(i,len-,){
if(str[i]==str[len]) rcnt++;
else break;
}
if(nn!=){
if(lcnt==len && rcnt==len) chkmax(cont[nn][str[]-'a'],len*(cont[nn-][str[]-'a']+)+cont[nn-][str[]-'a']);
else if(str[]==str[len]){
if(cont[nn-][str[]-'a']) chkmax(cont[nn][str[]-'a'],lcnt+rcnt+);
}
else{
chkmax(cont[nn][str[]-'a'],lcnt+!!cont[nn-][str[]-'a']);
chkmax(cont[nn][str[len]-'a'],rcnt+!!cont[nn-][str[len]-'a']);
}
}
FOR(i,,) chkmax(cont[nn][i],!!cont[nn-][i]);
}
int res=;
FOR(i,,) res=max(res,cont[n][i]);
printf("%d\n",res);
}
CF1131E String Multiplication(???)的更多相关文章
- Lua 中的string库(字符串函数库)总结
(字符串函数库)总结 投稿:junjie 字体:[增加 减小] 类型:转载 时间:2014-11-20我要评论 这篇文章主要介绍了Lua中的string库(字符串函数库)总结,本文讲解了string库 ...
- Codeforces #541 (Div2) - E. String Multiplication(动态规划)
Problem Codeforces #541 (Div2) - E. String Multiplication Time Limit: 2000 mSec Problem Descriptio ...
- FZU 2218 Simple String Problem(简单字符串问题)
Description 题目描述 Recently, you have found your interest in string theory. Here is an interesting que ...
- coderforces Gym 100803A/Aizu 1345/CSU 1536/UVALive 6832 Bit String Reordering(贪心证明缺)
Portal: http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=1345 http://codeforces.com/gym/100 ...
- FZU - 2218 Simple String Problem(状压dp)
Simple String Problem Recently, you have found your interest in string theory. Here is an interestin ...
- 【Kata Daily 190903】String incrementer(字符串增量器)
原题: Your job is to write a function which increments a string, to create a new string. If the string ...
- 每日总结:String类(2021.10.6)
String创建的字符串存储在公共池中 如: String s1="Runoob": new创建的字符串对象在堆上 如: String s2=new String("Ru ...
- CF1487G String Counting (容斥计数)
传送门 考虑$c[i]>n/3$这个关键条件!最多有2个字母数量超过$n/3$! 没有奇数回文?长度大于3的回文串中间一定是长度为3的回文串,所以合法串一定没有长度=3的回文,也就是$a[i]\ ...
- String类(C++练习二)
字符串类(String),熟悉内存管理与拷贝控制 类定义 #include <iostream> //#include <cstring> using std::cout; u ...
随机推荐
- jQuery EasyUI window窗口使用实例
需求:点击[增加]按钮,弹出窗口,并对所有输入项内容进行校验,校验通过就提交给后台的action处理,没有通过校验就弹窗提示. <!DOCTYPE html> <html> ...
- java随笔3 spring 的注入执行逻辑顺序
- 五句话搞定JavaScript作用域(ES5)
JavaScript的作用域一直以来是前端开发中比较难以理解的知识点,对于JavaScript的作用域主要记住几句话,走遍天下都不怕... 一.“JavaScript中无块级作用域” 在Java或C# ...
- 认识SQL
一.SQL介绍 SQL 是用于访问和处理数据库的标准的计算机语言. i.What? SQL 指结构化查询语言 SQL 使我们有能力访问数据库 SQL 是一种 ANSI 的标准计算机语言 ii.How? ...
- Debian下配置防火墙iptables
debian下iptables输入命令后即时生效,但重启之后配置就会消失,可用iptables-save快速保存配置,因为Debian上iptables是不会保存规则的,然后在开机自动的时候让ipta ...
- js auto hover button & html5 button autofocus
js auto hover button & html5 button autofocus input // html 5 <input name="myinput" ...
- 常用Mac快捷键
1.复制Cmd + C 粘贴Cmd + C —-> Cmd + V 剪切Cmd + C —-> Cmd + Opt + V 2.查看隐藏文件 Cmd + shift + . 3. 货币符号 ...
- 根据request获取请求客户端的外网ip
//根据request获取外网ip private static String getRemoteIp(HttpServletRequest request) { //x-forwarded-for: ...
- vue-cli: preset预设
preset:预设 vue create demo01 过程中,会保存预设,自动保存着 .vuerc 文件中 .vuerc 文件的位置:C:\Users\Administrator C:\Users\ ...
- 01.javascript之数据类型
1.数据类型 JavaScript一共有六种数据类型.(ES6新增了第七种Symbol类型的值) 数值(Number) 字符串(String) 布尔值(boolean) undefined null ...