当前位置:首页 / 文章测试 / ac自动机cpp

ac自动机cpp

开始打字练习

#include<iostream>

#include<queue>

#include<algorithm>

#include<numeric>

#include<map>

#include<functional>

#include<cmath>

#include<random>

using namespace std;

mt19937 rnd(time(0));

constexpr auto INF = 11451419;

constexpr long long MOD = 1e9 + 7;

constexpr long long PRI = 233317;

constexpr auto MAXN = 1000010;

constexpr auto MINS = 100010;

#define ll long long

#define ull unsigned long long

#define i64 long long

int cnt;

vector<int> bak[MAXN];

int nxt[MAXN][27];

int fail[MAXN];

int vis[MAXN];

int ans[MAXN];

vector<int> tree[MAXN];

void trie(const string& s, int i){

int p = 0;

for (auto it : s){

if (nxt[p][it - 'a' + 1] == 0)nxt[p][it - 'a' + 1] = ++cnt;

p = nxt[p][it - 'a' + 1];

}

bak[p].push_back(i);

}

void ac(){

queue<int> q;

for (int i = 1;i <= 26;i++){

if (nxt[0][i])q.push(nxt[0][i]);

}

while (q.size()){

int p = q.front();q.pop();

for (int i = 1;i <= 26;i++){

if (nxt[p][i]){

fail[nxt[p][i]] = nxt[fail[p]][i];

q.push(nxt[p][i]);

} else{

nxt[p][i] = nxt[fail[p]][i];

}

}

}

}

void dfs(int p){

for (auto it : tree[p]){

dfs(it);

vis[p] += vis[it];

}

for (auto it : bak[p]){

ans[it] += vis[p];

}

}

void solve(){

int n;cin >> n;

for (int i = 1;i <= n;i++){

string s;cin >> s;

trie(s, i);

}

ac();

int p = 0;

string str;cin >> str;

for (auto it : str){

p = nxt[p][it - 'a' + 1];

vis[p]++;

}

for (int i = 1;i <= cnt;i++)tree[fail[i]].push_back(i);

dfs(0);

for (int i = 1;i <= n;i++)cout << ans[i] << endl;

}

int main(){

cin.tie(0);

cout.tie(0);

ios::sync_with_stdio(0);

int n = 1;//cin >> n;

while (n--){

solve();

}

return 0;

}

声明:以上文章均为用户自行发布,仅供打字交流使用,不代表本站观点,本站不承担任何法律责任,特此声明!如果有侵犯到您的权利,请及时联系我们删除。

本文打字速度TOP10

  • 暂无打字数据!