1 条题解
-
0
思路
无模式为另一模式子串,在线栈消除等价于每次从头删最左屏蔽词;删除后自动机状态同步回退,保证结果非空。
参考程序(C++11)
#include <bits/stdc++.h> using namespace std; int main(){ios::sync_with_stdio(false);cin.tie(nullptr);string s;int n;cin>>s>>n;vector<array<int,26>>go(1);vector<int>fail(1),len(1);for(int k=0;k<n;k++){string p;cin>>p;int v=0;for(char c:p){int x=c-'a';if(!go[v][x]){go[v][x]=go.size();go.push_back({});fail.push_back(0);len.push_back(0);}v=go[v][x];}len[v]=p.size();}queue<int>q;for(int c=0;c<26;c++)if(go[0][c])q.push(go[0][c]);while(!q.empty()){int v=q.front();q.pop();for(int c=0;c<26;c++)if(go[v][c]){int u=go[v][c];fail[u]=go[fail[v]][c];len[u]=max(len[u],len[fail[u]]);q.push(u);}else go[v][c]=go[fail[v]][c];}string out;vector<int>states;for(char c:s){int v=go[states.empty()?0:states.back()][c-'a'];out+=c;states.push_back(v);if(len[v]){out.resize(out.size()-len[v]);states.resize(states.size()-len[v]);}}cout<<out<<'\n';}
- 1