这题难度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(???)的更多相关文章

  1. Lua 中的string库(字符串函数库)总结

    (字符串函数库)总结 投稿:junjie 字体:[增加 减小] 类型:转载 时间:2014-11-20我要评论 这篇文章主要介绍了Lua中的string库(字符串函数库)总结,本文讲解了string库 ...

  2. Codeforces #541 (Div2) - E. String Multiplication(动态规划)

    Problem   Codeforces #541 (Div2) - E. String Multiplication Time Limit: 2000 mSec Problem Descriptio ...

  3. FZU 2218 Simple String Problem(简单字符串问题)

    Description 题目描述 Recently, you have found your interest in string theory. Here is an interesting que ...

  4. 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 ...

  5. FZU - 2218 Simple String Problem(状压dp)

    Simple String Problem Recently, you have found your interest in string theory. Here is an interestin ...

  6. 【Kata Daily 190903】String incrementer(字符串增量器)

    原题: Your job is to write a function which increments a string, to create a new string. If the string ...

  7. 每日总结:String类(2021.10.6)

    String创建的字符串存储在公共池中 如: String s1="Runoob": new创建的字符串对象在堆上 如: String s2=new String("Ru ...

  8. CF1487G String Counting (容斥计数)

    传送门 考虑$c[i]>n/3$这个关键条件!最多有2个字母数量超过$n/3$! 没有奇数回文?长度大于3的回文串中间一定是长度为3的回文串,所以合法串一定没有长度=3的回文,也就是$a[i]\ ...

  9. String类(C++练习二)

    字符串类(String),熟悉内存管理与拷贝控制 类定义 #include <iostream> //#include <cstring> using std::cout; u ...

随机推荐

  1. MySQL Limit优化(转)

    原文:http://bbs.landingbj.com/t-0-240894-1.html 首先,我们看一个分页SQL: SELECT time,pageFROM `l_not_200_page`WH ...

  2. css行内省略号、垂直居中

    应用场景分析: 一.当你的文字限定行数,超出部分的文字用省略号显示. (有两个使用场景:1.单行 2.多行) // 单行 overflow: hidden; text-overflow:ellipsi ...

  3. Oracle创建表sql语句

    create table t_owners ( id number primary key, name ), addressid number, housenumber ), watermeter ) ...

  4. 一个简单jpa例子

    package com.example.demo.entity; import javax.persistence.*; /*使用jpa注解配置映射关系*/ /*告诉jpa这是一个实体类和(数据表映射 ...

  5. Guava Cache源码详解

    目录 一.引子 二.使用方法 2.1 CacheBuilder有3种失效重载模式 2.2 测试验证 三.源码剖析 3.1 简介 3.2 源码剖析 四.总结 优点: 缺点: 正文 回到顶部 一.引子 缓 ...

  6. maven 中的pom中的 dependencyManagement 和 dependencies

    参考:maven pom.xml 中 dependencyManagement和dependencies详解 现在的项目基本上都是使用多module来管理的,这就涉及到一个问题,多module之间如何 ...

  7. NLP的原理,框架及具体实例

    1. 什么是NLP 所谓NLP就是自然语言处理,即计算机识别人的自然沟通语言,将人的语言转换成表达含义相同的文字.因为NLP的目的是将人和计算机通过自然语言沟通成为可能,而人最方便的沟通是通过语音发声 ...

  8. html5 表單輸入類型

    輸入類型有:email,url,number,range,Date pickers(工作機制是什麼),search, 有相關類型的輸入域,會對域進行驗證. 不同的瀏覽器並不一定都支持所有的輸入類型.

  9. Hack You CTF 2014: NotEasyTask

    exe文件,运行后闪退,peid查一下,发现是是c#写的 Reflector打开 找到Main: private static void Main(string[] args) { string ho ...

  10. Photoshop独立安装包下载页面

    下载页面地址:https://helpx.adobe.com/cn/creative-cloud/kb/creative-cloud-apps-download.html