码迷,mamicode.com
首页 > 其他好文 > 详细

【AGC026】E - Synchronized Subsequence

时间:2018-07-25 17:46:01      阅读:232      评论:0      收藏:0      [点我收藏+]

标签:putchar   fir   iostream   eof   getc   sub   double   algo   代码   

题解

这个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(‘\n‘)
#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;
}

【AGC026】E - Synchronized Subsequence

标签:putchar   fir   iostream   eof   getc   sub   double   algo   代码   

原文地址:https://www.cnblogs.com/ivorysi/p/9367122.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!