首页 > 其他分享 >Codeforces Global Round 7 D

Codeforces Global Round 7 D

时间:2022-11-02 17:33:22浏览次数:92  
标签:string int Global Codeforces mx ss ans Round dp

D1. Prefix-Suffix Palindrome (Easy version)

easy版本 我们只需要n2 dp预处理出快速判断回文串
然后我们再通过双指针O(n)求解最大串

int dp[5010][5010];
void solve(){
    string s;cin>>s;
    int n=s.size();s=')'+s;
    for(int i=0;i<=n;i++)for(int j=0;j<=n;j++)dp[i][j]=0;
    for(int i=1;i<=n;i++){
        dp[i][i]=1;
        if(i!=1&&s[i]==s[i-1])dp[i-1][i]=1;
    }
    for(int len=3;len<=n;len++){
        for(int i=1,j=i+len-1;j<=n;j++,i++){
            if(s[i]==s[j])dp[i][j]|=dp[i+1][j-1];
        }
    }
    int ans=0;string S;
    for(int i=1;i<=n;i++)if(dp[1][i]){
        if(ans<i)S=s.substr(1,i),ans=i;
    }
    for(int i=1;i<=n;i++)if(dp[i][n]){
        if(ans<n-i+1)S=s.substr(i,n-i+1),ans=n-i+1;
    }
    int l=0;
    for(int i=1,j=n;i<j;i++,j--){
        if(s[i]!=s[j])break;
        else{
            int t=0;
            for(int k=i+1;k<j;k++)if(dp[i+1][k])t=max(t,k-i);
            for(int k=j-1;k>i;k--)if(dp[k][j-1])t=max(t,j-k);
            if(ans<i*2+t){
                ans=i*2+t;
                l=i;
            }
        }
    }
    if(!l)cout<<S<<endl;
    else{
        S.clear();
        string r=s.substr(1,l);
        S+=r;
        int i=l,j=n-l+1,t=0;
        string q;
        for(int k=i+1;k<j;k++)if(dp[i+1][k]){
            if(t<k-i){
                t=k-i;
                q=s.substr(i+1,t);
            }
        }
        for(int k=j-1;k>i;k--)if(dp[k][j-1]){
            if(t<j-k){
                t=j-k;
                q=s.substr(k,t);
            }
        }
        S+=q;
        std::reverse(r.begin(), r.end());
        S+=r;
        cout<<S<<endl;
    }
}

D2. Prefix-Suffix Palindrome (Hard version)

相比于上一个 我们还可以发现的性质就是
我们最开始就可以贪到彻底 直接去找最长的前缀后缀
因为我们不可能前面会有一个很小的前缀后缀with一个字符串 如果是的话这样字符串贪到彻底也是相同的ans
所以我们问题就变成了一个字符串中求最长的前缀/后缀回文串
我们直接O(n)的manacher就可以了
manacher是求出每一个p[i]以i坐标为中心的最长回文半径
我们只要p[i]==i 那么就是最长前缀了不是吗
后缀我们reverse一遍即可

inline int work(string s, int n) {
    string ss = "$#";
    vector<int>p;
    for (int i = 0; i < n; i++) ss += s[i], ss += "#";
    p.push_back(1);
    int mx = 0, id = 0, ans = 1;
    for (int i = 1; i < (int)ss.length(); i++) {
        p.push_back(mx > i ? min(p[2*id-i], mx - i) : 1);
        while (i + p[i] < (int)ss.length() && ss[i+p[i]] == ss[i-p[i]]) ++p[i];
        if (i == p[i]) ans = max(ans, p[i]);
        if (i + p[i] > mx) mx = i + p[i], id = i;
    }
    return ans - 1;
}
void solve(){
    string s;cin>>s;int n=s.size();s=')'+s;
    int l=0,r=n+1;
    for(int i=1,j=n;i<j;i++,j--) {
        if (s[i] != s[j])break;
        l = i, r = j;
    }
    string t;
    for(int i=l+1;i<r;i++)t.push_back(s[i]);
    int ans_l=work(t,r-l-1);
    reverse(all(t));
    int ans_r=work(t,r-l-1);
    if(ans_l>ans_r)reverse(all(t)),swap(ans_l,ans_r);
    for(int i=1;i<=l;i++)cout<<s[i];
    for(int i=0;i<ans_r;i++)cout<<t[i];
    for(int i=l;i>=1;i--)cout<<s[i];
    cout<<endl;
}

标签:string,int,Global,Codeforces,mx,ss,ans,Round,dp
From: https://www.cnblogs.com/ycllz/p/16851779.html

相关文章

  • Codeforces Round #820 (Div. 3) A-G
    比赛链接A题解知识点:模拟时间复杂度\(O(1)\)空间复杂度\(O(1)\)代码#include<bits/stdc++.h>#definelllonglongusingnamespacestd;boolsolve(){......
  • Codeforces Round #611 (Div. 3) E
    E.NewYearParties对于最大值我们显然可以sort之后贪心一下即可正确性显然对于最小值我们发现会有三种情况一种是三个挨在一起一种是两个挨在一起还有一种就是......
  • .Net Core后台任务启停(BackgroundService)
    BackgroundService描述说明:BackgroundService类 说到定时任务,可能第一个会想到Quartz,但是想到需要更简洁,而且想要毫秒级的周期,这个Cron真是太不智慧了,虽说可以在单个......
  • J - Just Arrange the Icons CodeForces - 1267J (思维+暴力)
    题意n个软件,每个软件都有种类,而屏幕有容量s(自己决定),有两个限制:一个屏幕只能放s-1或者s个软件一个屏幕上只能防同种的软件求最小的屏幕数。思路枚举s代......
  • 「题解」Codeforces 1322B Present
    看上去异或里面套了层加法不好拆位,但是依然可以对每个二进制位处理。现在考虑第\(k\)位,那么产生贡献的数字对一定满足以下条件之一:第\(k\)位相同且前\((k-1)\)位......
  • 「题解」Codeforces 930E Coins Exhibition
    看到题就先容斥。然后容斥系数太难算了就寄了,大概要分好几种情况讨论,于是就弃了。不容斥也能做。考虑限制将串划分成了若干段,然后一段一段dp.有没有什么好的方法描述这个......
  • Codeforces - 1391C - Cyclic Permutations(思维 + 组合数学 + 数论 + 图论、*1500)
    1391C-CyclicPermutations(⇔源地址)目录1391C-CyclicPermutations(⇔源地址)tag题意思路AC代码错误次数:0tag⇔思维、⇔组合数学、⇔数论、⇔......
  • Codeforces Round #611 (Div. 3) D
    D.ChristmasTrees显然对于一个中间的点要是不能向两边最近的扩展我们直接判定他没有用处了这样我们就有了bfs的做法我们先把原点放进去要是能扩展我们显然可以直接......
  • Codeforces Round #667 (Div. 3) ABCD
    https://codeforces.com/contest/1409A.YetAnotherTwoIntegersProblem题目大意:k∈[1;10]我们每次可以选择a:=a+kora:=a−k问a要经历多少次操作变成b?input......
  • Codeforces 1730 D
    Codeforces1730D题意定义一次“操作”为把字符串$a$的前$k$个字母与字符串$b$的后$k$个字母交换。问能不能经过有限次操作后,让$a=b$。注:$......