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 ...
随机推荐
- 分布式ID生成系统 UUID与雪花(snowflake)算法
Leaf——美团点评分布式ID生成系统 -https://tech.meituan.com/MT_Leaf.html 网游服务器中的GUID(唯一标识码)实现-基于snowflake算法-云栖社区-阿 ...
- .net WCF WF4.5
花了两天时间学习使用WF,把一些遇到的问题记录下来,使用的环境是VS2017,网上的资料普遍太老了 需要注意,如果使用多项目同时启动的方式需要把WCF调整到WF启动顺序之上 1.怎么使用代码活动 新建 ...
- Windows激活
最近重新安装了一下系统,我的系统是Windows10.这就出现了一个问题,如果是Windows7系统的话,可以使用网上的破解工具进行破解操作,使之成为永久破解版.但是Windows10系统,网上对于它 ...
- 熟悉pyspider的装饰器
熟悉pyspider的装饰器取经地点:https://segmentfault.com/a/1190000002477863 @config(age=10 * 24 * 60 * 60) 在这表示我们 ...
- vue传参
<template> <ul> <li v-for="item in list" :key="item.id"> <b ...
- java Date时间的各种转换方式和Mysql存时间类型字段的分析
一:各种Date之间的转换方法 public class TimeTest { public static void main(String[] args) { Date date = new Dat ...
- 组建自己的局域网(可以将PC机实现为服务器)
最近想要自己组建一个集群,并且可以通过外网访问,查了好些资料,终于成功了! 设备清单:笔记本1:(4g内存,500g硬盘),笔记本2:(12g内存,120g固态硬盘) (笔记本2上装有5台虚拟机,操作 ...
- hive聚合函数和表生成函数
explode生成单独的一行
- 在windows 7 和linux上安装xlwt和xlrd
在windows 7上安装xlwt xlrd xlwt是开源社区编写的python库,需要单独安装,下载地址https://pypi.python.org/pypi/xlwt 目前xlwt最新的版本是 ...
- k8s调度器、预选策略及调度方式
一.k8s调度流程 1.(预选)先排除完全不符合pod运行要求的节点2.(优先)根据一系列算法,算出node的得分,最高没有相同的,就直接选择3.上一步有相同的话,就随机选一个 二.调度方式 1.no ...