日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

P3966 [TJOI2013]单词(AC自动机)

發(fā)布時間:2023/12/18 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 P3966 [TJOI2013]单词(AC自动机) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

傳送門

裸題做法

按照題意把每個字符串拼接建立ACACAC自動機

然后在自動機上建立tiretiretire圖進行樹型dpdpdp

輸出就行了…

但是有問題

因為文章不是直接把字符串拼接出來的,兩個單詞間是有空隙的

所以我們也在拼接中的間隙加一個無法匹配的字符就好了,這樣就是模板題

#include <bits/stdc++.h> using namespace std; const int maxn = 2e6+10; int zi[maxn][27],fail[maxn],last[maxn],n,id,top,siz[maxn],mp[maxn]; char a[maxn]; string s[maxn]; struct edge{int to,nxt; }d[maxn]; int head[maxn],cnt=1; void add(int u,int v){ d[++cnt] = (edge){v,head[u]},head[u] = cnt; } void insert(string a,int index ) {int n = a.length(), now = 0;for(int i=0;i<n;i++){if( zi[now][a[i]-'a']==0 ) zi[now][a[i]-'a'] = ++id;now = zi[now][a[i]-'a'];}mp[index] = now; } void get_fail() {queue<int>q;for(int i=0;i<=26;i++)if( zi[0][i] ) q.push( zi[0][i] );while( !q.empty() ){int u = q.front(); q.pop();for(int i=0;i<=26;i++){if( zi[u][i] )fail[zi[u][i]] = zi[fail[u]][i],q.push( zi[u][i] );elsezi[u][i] = zi[fail[u]][i]; }} } void get_query() {int now = 0;for(int i=1;i<=top;i++){now = zi[now][a[i]-'a'];siz[now]++; } } void dfs(int u) {for(int i=head[u];i;i=d[i].nxt ){int v = d[i].to; dfs(v);siz[u] += siz[v];} } int main() {cin >> n;for(int i=1;i<=n;i++){cin >> s[i];insert( s[i],i );int len = s[i].length();for(int j=0;j<len;j++) a[++top] = s[i][j];a[++top] = 'a'+26;}get_fail(); get_query();for(int i=1;i<=id;i++) add(fail[i],i);dfs( 0 );for(int i=1;i<=n;i++) cout << siz[mp[i]] << endl; }

稍變化的做法

建立acacac自動機

把單詞插入tiretiretire樹上的時候,把經(jīng)過的路徑上的節(jié)點答案都加加

意思是根到這個點的單詞(如果有)答案就加加

當(dāng)然這樣統(tǒng)計不完整,每個節(jié)點所有的后綴答案都應(yīng)該加加

所以還是樹型dpdpdp寫…

總結(jié)

以上是生活随笔為你收集整理的P3966 [TJOI2013]单词(AC自动机)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。