AGC026E - Synchronized Subsequence

Posted ivorysi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AGC026E - Synchronized Subsequence相关的知识,希望对你有一定的参考价值。

题解

这个E为啥这么水
不过这个数据范围不用写SA或者SAM直接暴力即可,好评(当然其实写起来也不难。。。)
如果b在a前就一直选,选到某个最大的a的位置会更改成一段a在b前
如果这个a在b前是最后一部分就取到所有的abababab...前,否则就跳过这一段
具体就用string维护一下后缀能取到的max字符串就好了

代码

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <cmath>
#include <queue>
#include <ctime>
#include <map>
#include <set>
#define fi first
#define se second
#define pii pair<int,int>
//#define ivorysi
#define mp make_pair
#define pb push_back
#define enter putchar(‘
‘)
#define space putchar(‘ ‘)
#define MAXN 6005
using namespace std;
typedef long long int64;
typedef double db;
typedef unsigned int u32;
template<class T>
void read(T &res) {
    res = 0;T f = 1;char c = getchar();
    while(c < ‘0‘ || c > ‘9‘) {
        if(c == ‘-‘) f = -1;
        c = getchar();
    }
    while(c >= ‘0‘ && c <= ‘9‘ ) {
        res = res * 10 - ‘0‘ + c;
        c = getchar();
    }
    res *= f;
}
template<class T>
void out(T x) {
    if(x < 0) {x = -x;putchar(‘-‘);}
    if(x >= 10) {
        out(x / 10);
    }
    putchar(‘0‘ + x % 10);
}
namespace task {
    char s[MAXN];
    int N,a[MAXN],b[MAXN],tota,totb,pos[MAXN];
    string str[MAXN];
    bool vis[MAXN];
    void Init() {
        read(N);
        scanf("%s",s + 1);
        tota = 0;totb = 0;
        for(int i = 1 ; i <= 2 * N ; ++i) {
            if(s[i] == ‘a‘) {a[++tota] = i;pos[i] = tota;}
            else {b[++totb] = i;pos[i] = totb;}
        }
    }
    void Solve() {
        str[2 * N + 1] = "";
        for(int i = 2 * N ; i >= 1 ; --i) {
            str[i] = max(str[i],str[i + 1]);
            string t = "";
            int p = pos[i];
            if(s[i] == ‘a‘ && a[p] < b[p]) {
                str[i] = max(str[i],"ab" + str[b[p] + 1]);
            }
            else if(s[i] == ‘b‘ && b[p] < a[p]) {
                memset(vis,0,sizeof(vis));
                int maxv = a[p];
                for(int j = i ; j <= maxv ; ++j) {
                    if(s[j] == ‘b‘) {
                        p = pos[j];
                        vis[b[p]] = 1;vis[a[p]] = 1;
                        maxv = max(a[p],maxv);
                    }
                    if(vis[j]) t += s[j];
                }
                t += str[maxv + 1];
                str[i] = max(str[i],t);
            }
        }
        cout<<str[1]<<endl;
    }
}
int main() {
#ifdef ivorysi
    freopen("f1.in","r",stdin);
#endif
    task::Init();
    task::Solve();
    return 0;
}




以上是关于AGC026E - Synchronized Subsequence的主要内容,如果未能解决你的问题,请参考以下文章

AGC+FPGA基于FPGA的数字AGC自适应增益设计,应用在BPSK调制解调系统中

agc045_b 01 Unbalanced

AGC增长服务3-App Linking示例

agc045_c Range Set

agc025_d Choosing Points

agc041_d Problem Scores