2018 Nowcoder Multi-University Training Contest 10

Practice Linkc++

J. Rikka with Nicknamespa

題意:
給出\(n\)個字符串,要求依次合併兩個串\(s, t\),知足將\(t\)合併到\(s\)中變成\(r\),使得\(s\)\(r\)的前綴,而且\(t\)\(r\)的一個子序列。code

思路:
動態維護序列自動機,貪心插入便可。字符串

代碼:get

#include <bits/stdc++.h>
using namespace std;
 
#define N 1000010
char s[N], res[N];
int nx[N][26];
int n, m, len;
 
void add(int now) {
    for (int i = now; i <= len; ++i) {
        res[++m] = s[i];
        for (int j = m - 1; j >= 0; --j) {
            nx[j][res[m] - 'a'] = m;
            if (res[j] == s[i]) {
                break;
            }
        }
    }
}
 
int main() {
    int T; scanf("%d", &T);
    while (T--) {
        m = 0;
        memset(nx, -1, sizeof nx);
        scanf("%d", &n);
        for (int i = 1; i <= n; ++i) {
            scanf("%s", s + 1);
            len = strlen(s + 1);
            if (i == 1) {
                add(1);
            } else {
                int now = 0;
                for (int j = 1; j <= len; ++j) {
                    now = nx[now][s[j] - 'a'];
                    if (now == -1) {
                        add(j);
                        break;
                    }
                }
            }
        }
        res[m + 1] = 0;
        printf("%s\n", res + 1);
    }
    return 0;
}
相關文章
相關標籤/搜索