Codeforces Round #541 (Div. 2) E 字符串 + 思维 + 猜性质

Posted virtu0s0

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #541 (Div. 2) E 字符串 + 思维 + 猜性质相关的知识,希望对你有一定的参考价值。

https://codeforces.com/contest/1131/problem/D

题意

给你n个字符串,字符串长度总和加起来不会超过1e5,定义字符串相乘为(s*s1=s1+s[0]+s1+s[1]+s1+...+s1+s[size-1]+s1+s[size]+s1),求n个字符串依次相乘后最长连续字符相同的子序列长度

题解

  • 鬼畜的题意 or 难以优化的复杂度,都需要观察性质才能做,第二串要插入第一个串每个字符之间,可以看出字符数增长的速度很快,所以并不能把整个字符存下来
  • 只看一种字符的话,最优选择肯定是将后面的串插进前面串最长子序列之间
  • 分两种情况看,假设当前答案为len,cal()为计算当前字符串最长子序列函数,front()为最长前缀,back()为最长后缀
    • 假如第二串是由同一字符组成,那么len=|s2|*(len+1)+len
    • 反之,len=max(cal(s2),front(s2)+back(s2)+1),答案可能在为s2中,或者两个s2夹着一个s1的字符

代码

#include<bits/stdc++.h>
#define M 100005
using namespace std;
string s[M];
int i,j,n,tp,ans;

int ft(int p,char c){
    int cnt=0;
    for(int i=0;i<s[p].size();i++){
        if(s[p][i]==c)cnt++;
        else return cnt;
    }
}
int bk(int p,char c){
    int cnt=0;
    for(int i=s[p].size()-1;i>=0;i--){
         if(s[p][i]==c)cnt++;
         else return cnt;
    }
}
int cal(int p,char c){
    int cnt=0,ans=0;
    for(int i=0;i<s[p].size();i++){
        if(s[p][i]==c)cnt++;
        else cnt=0;
        ans=max(ans,cnt);
    }
    return ans;
}
int ck(int p,char c){
    for(int i=0;i<s[p].size();i++){
        if(s[p][i]!=c)return 0;
    }
    return 1;
}
int main(){
    cin>>n;
    for(i=1;i<=n;i++)cin>>s[i];
    for(i=0;i<26;i++){
        tp=0;
        for(j=1;j<=n;j++){
            if(tp==0){
                tp=cal(j,i+'a');
            }else{
                if(ck(j,i+'a'))
                   tp+=cal(j,i+'a')*(tp+1);
                else
                   tp=max(cal(j,i+'a'),ft(j,i+'a')+bk(j,i+'a')+1);
            }
            /*if(tp>ans){
                cout<<i<<" "<<j<<" "<<tp<<endl;
                ans=max(ans,tp);
            }
            */
        }
        ans=max(ans,tp);
    }
    cout<<ans;
}

以上是关于Codeforces Round #541 (Div. 2) E 字符串 + 思维 + 猜性质的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Round #541 题解

Codeforces Round #541 (Div. 2) (A~F)

codeforces Round #541 (Div 2)

Codeforces Round #541 (Div. 2) D 并查集 + 拓扑排序

Codeforces Round #541 (Div. 2) E 字符串 + 思维 + 猜性质

cf-Round541-Div2-F(并查集+静态链表)