P5357 模板 AC自動機(二次加強版)

2021-09-26 05:28:53 字數 1117 閱讀 2630

題目大意:給n個模式串和乙個主串,分別輸出每個模式串在主串**現過幾次

題目思路:ac自動機模板題,ac自動機就是先建乙個字典樹,然後建fail指標,建fail的時候如果是模式串中給的字元,就建fail,否則就繼承之前的fail情況,這是為了以後不用跳fail能直接得到想要的值。接著就是最精華的地方,也是普通ac自動機的優化。在匹配過程中它不再需要每次匹配都往回跳fail,只管走自己的路,然後反向建乙個fail樹,這樣長的匹配過以後它回溯的時候會給那幾個小傢伙也算上。

詳細過程參照這個菊苣的部落格

以下是**:

#includeusing namespace std;

#define inf 0x3f3f3f3f

#define rep(i,a,b) for(int i=a;i<=b;i++)

#define per(i,a,b) for(int i=a;i>=b;i--)

#define ll long long

const int maxn = 2e5+5;

const int maxm = 2e6+5;

int trie[maxn][26],tot,end,pos[maxn],fail[maxn],num[maxn];

char s[maxm];

void insert(int l)

pos[l]=p;

}vectorv[maxn];

queueq;

void dfs(int u)

}int main()

rep(i,0,25)trie[0][i]=1;

q.push(1);

while(!q.empty())

else trie[u][i]=trie[fail[u]][i];}}

scanf("%s",s);

int len=strlen(s);

int p=1;

rep(i,0,len-1)

rep(i,0,tot)v[i].clear();

rep(i,2,tot)v[fail[i]].push_back(i);

dfs(1);

rep(i,1,n)cout<}

return 0;

}

P5357 模板 AC自動機(二次加強版)

題意 給出模式串,再給出文字串,求出每個模式串的出現次數 思路 經典的跑ac自動機的題,但是有個坑 會有相同的字元 這道題得建fail樹跑dfs,不然會超時 1 include2 using namespace std 3const int maxn 1e6 10 4 struct actrie 1...

洛谷 5357 模板 AC自動機(二次加強版)

題目描述 給你乙個文字串 s 和 n 個模式串 t 1.n t t1 n 請你分別求出每個模式串 t it i ti 在 s 現的次數。輸入格式 第一行包含乙個正整數 n 表示模式串的個數。接下來 n 行,第 i 行包含乙個由小寫英文本母構成的字串 t it i ti 最後一行包含乙個由小寫英文本母...

洛谷P5357 AC自動機 二次加強版

題目大意 給你n個模式串t it i ti 乙個匹配串s.問你每個模式串出現過多少次.n 2 e5,ti 2e5 s 1e6 n leq 2e5 sum t i leq 2e5 s leq 1e6 n 2e5,ti 2 e5,s 1 e6題目思路 模板 優化。其實我們可以發現ac自動機在查詢的時候,...