#423 Div2 C

#423 Div2 C

题意

给出 n 个字符串以及他们在 S 串中出现的位置,求字典序最小的 S 串。保证给出的字符串不会冲突。

分析

模拟就好。用并查集思想优化,数组 nxt[i] 表示从 i 开始 接下来还未填字母的第一个位置。初始化 nxt[i] = i

code

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = 1e5 + 5;
const int N = 2e6 + 10;
char str[N], s[N];
int nxt[N];
int fd(int x) {
    return x == nxt[x] ? x : (nxt[x] = fd(nxt[x]));
}
int main() {
    for(int i = 0; i < N; i++) {
        nxt[i] = i;
    }
    int n;
    scanf("%d", &n);
    for(int i = 0; i < n; i++) {
        scanf("%s", s);
        int len = strlen(s);
        int c;
        scanf("%d", &c);
        for(int j = 0; j < c; j++) {
            int x;
            scanf("%d", &x);
            x--;
            int l = len;
            int pos = 0;
            int nxt_x = fd(x);
            while(nxt_x - x < l) {
                pos = nxt_x - x;
                str[nxt_x] = s[pos];
                nxt[nxt_x] = fd(nxt_x + 1);
                nxt_x = nxt[nxt_x];
            }
        }
    }
    int ii = -1;
    for(int i = N - 1; i >= 0; i--) {
        if(str[i] >= 'a' && str[i] <= 'z') {
            if(ii == -1) ii = i + 1;
        } else {
            str[i] = 'a';
        }
    }
    if(ii == -1) ii = 0;
    str[ii] = 0;
    printf("%s\n", str);
    return 0;
}
posted @ 2017-07-13 16:48  ftae  阅读(99)  评论(0编辑  收藏  举报