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 ...
随机推荐
- WIN下修改host文件并立即生效
怎样修改WIN7下的host文件_百度经验https://jingyan.baidu.com/article/9faa72317903f1473c28cb01.html hosts立即生效的方法 - ...
- c# winform导出Excel
//需要注意添加引用Microsoft.Office.Interop.Excel.dll string fileName =DateTime.Now.Year+ DateTime.Now.Month+ ...
- 查找文献的BibTex
BibTex可以通过Google Scholar来查找. 注意,默认情况下,Google scholar 关闭了显示BibTex链接. 打开Google Scholar 选择右上角菜单按钮 选择set ...
- API知识点总结
一.开发api接口开放给其他人调用的api接口(短信接口,支付宝api) 二.api安全弱点数据窃取(解决加密),数据篡改(解决MD5),数据泄露(爬虫技术)(解决令牌)1.加密(HTTPS传输-收费 ...
- web项目中的监听器,过滤器以及自定义servlet的执行顺序
可以看到web容器一启动就会实例化监听器的contextInitialized(ServletContextEvent event)方法,然后是过滤器的init()方法,最后在用户访问web应用的 时 ...
- MySQL最大连接数设置
在使用MySQL数据库的时候,经常会遇到这么一个问题,就是“Can not connect to MySQL server. Too many connections”-mysql 1040错误,这是 ...
- AdminLTE 前端框架
适合运维平台 后台管理系统 AdminLTE 是一个开源的后台控制面板和仪表盘 WebApp 模板. 这是一个快速的HTML模板,基于CSS框架的引导. 文档: http://adminlte.la ...
- PHP金额工具类之将阿利伯数字转换为大写中文数字
1.将阿拉伯数字转换为中文大写数字 <?php namespace core\components; class PriceHelper extends \yii\base\Component{ ...
- 五、core开发
一.支付方面的 https://www.cnblogs.com/stulzq/p/7606164.htmlhttps://www.cnblogs.com/guolianyu/
- 一、Dev
一.获取选中的表格 // MessageBox.Show(gridview_Parent.GetFocusedDataRow()["series"].ToString());//获 ...