ACAM板子93ptsTLE#6求调
查看原帖
ACAM板子93ptsTLE#6求调
206423
焚魂楼主2024/10/3 16:56
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>

using namespace std;

int n,ch[3000010][30],tot = 1,nxt[3000010],l;
bool v[3000010];
char input[3000010];
vector<char> ss;
struct node{
    int pd,let;
}bo[3000010];

void insert(char *s) {
    int u = 1,len = strlen(s);
    for(int i = 0;i < len;i++) {
        int c = s[i] - 'a';
        if(!ch[u][c]) ch[u][c] = ++tot;
        u = ch[u][c];
    }
    bo[u].pd++;
    bo[u].let = len;
}

void bfs() {
    for(int i = 0;i < 26;i++) ch[0][i] = 1;
    queue<int> q;
    q.push(1);
    while(!q.empty()) {
        int u = q.front();q.pop();
        for(int i = 0;i < 26;i++) {
            if(!ch[u][i]) ch[u][i] = ch[nxt[u]][i];
            else {
                int v = nxt[u];
                q.push(ch[u][i]);
                while(v > 0 && !ch[v][i]) v = nxt[v];
                nxt[ch[u][i]] = ch[v][i];
            }
        }
    }
}

bool find() {
    int u = 1,t = 0;
    for(int i = 0;i < l;i++) {
        int c = ss[i] - 'a';
        int k = ch[u][c];
        if(bo[k].pd) {
            ss.erase(ss.begin() + i - bo[k].let + 1,ss.begin() + i+1);
            l -= bo[k].let;
            return false;
        }
        u = ch[u][c];
    }
    return true;
}

int main() {
    cin >> input >> n;
    l = strlen(input);
    for(int i = 0;i < l;i++)
        ss.push_back(input[i]);
    for(int i = 1;i <= n;i++) {
        cin >> input;
        insert(input);
    }

    bfs();

    while(1) {
        bool flag = false;
        flag = find();
        if(flag) break;
    }

    for(vector<char>::iterator it = ss.begin();it != ss.end();it++)
        cout << *it;

    return 0;
}
2024/10/3 16:56
加载中...