88分,3个点没过,求帮助
查看原帖
88分,3个点没过,求帮助
1398086
ZASG楼主2024/10/21 23:19
#include <iostream>
#include <string>
#include <cstring>
#include <vector>
using namespace std;
const int N = 2e6+10;
int final[N],tire[N][26],fail[N],times[N],cnt;
int e[N],ne[N],h[N],idx;
int box[N];

void addEdge(int a,int b){
    e[idx] = b;
    ne[idx] = h[a];
    h[a] = idx++;
}

void Insert(int q,string& s){//将单词插入AC自动机
    int p = 0;
    for(int i = 0; i < s.size(); i++){
        int x = s[i] - 'a';
        if(!tire[p][x])tire[p][x] = ++cnt;
        p = tire[p][x];
    }
    final[q] = p;
}

void setFail(){

    int l = 0, r = -1;
    for(int i = 0; i < 26; i++){
        if(tire[0][i])box[++r] = tire[0][i];
    }
    while(l <=r ) {
        int u = box[l++];
        for (int i = 0; i < 26; i++) {
            if (tire[u][i]) {
                fail[tire[u][i]] = tire[fail[u]][i];
                box[++r] = tire[u][i];//将儿子节点压入到队列当中去
            } else {
                tire[u][i] = tire[fail[u]][i];
            }
        }
    }
}

void dfs(int u,int fa){
    if(u == fa)return;
    for(int i = h[u]; i != -1;i = ne[i]){
//        cout << u << "->" << e[i] << endl;
        dfs(e[i],u);
        times[u] += times[e[i]];
    }
}


int main(){
//    vector<string> words;
    int n;
    cin >> n;
    for(int i = 0;i < n; i++){
        string t;
        cin >> t;
        Insert(i,t);
    }
//    cout << 1 ;
    setFail();

    string article;
    cin >> article;
    for(int i = 0,u = 0; i < article.size(); i++){
        u = tire[u][article[i] - 'a'];
        times[u]++;
    }
    memset(h,-1,sizeof h);
    for(int i = 0; i <= cnt; i++){//建树
        addEdge(fail[i],i);
    }

//    for(int i = 0; i <= cnt; i++){
//        cout << fail[i] <<endl;
//    }
    dfs(0,-1);
    for(int i = 0; i < cnt; i++){
        if(final[i])printf("%d\n",times[final[i]]);
    }


    return 0;
}
2024/10/21 23:19
加载中...