hdu5384(AC自动机+纪录重复单词出现的次数)
生活随笔
收集整理的這篇文章主要介紹了
hdu5384(AC自动机+纪录重复单词出现的次数)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題意:
給出n篇文章,m個單詞,輸出每篇文章中單詞出現的次數,其中單詞會重復。
思路:
AC自動機模板題,添加一個單詞的結尾標記記錄即可。這里我們用了kuangbin的模板。
代碼:
#include <iostream> #include <stdio.h> #include <string.h> #include <algorithm> #include <queue> #include<map> using namespace std;string str; string buf[100005];struct Trie {int next[10010*50][128],fail[100010*50],end[101000*50];int root,L;int newnode(){for(int i = 0;i < 128;i++)next[L][i] = -1;end[L++] = -1;return L-1;}void init(){L = 0;root = newnode();}void insert(string s ,int id){int len = s.length();int now = root;for(int i = 0;i < len;i++){if(next[now][s[i]] == -1)next[now][s[i]] = newnode();now = next[now][s[i]];}if(end[now]==-1)//就是這里,記錄單詞的次數end[now]=1;elseend[now]++;}void build(){queue<int>Q;fail[root] = root;for(int i = 0;i < 128;i++)if(next[root][i] == -1)next[root][i] = root;else{fail[next[root][i]] = root;Q.push(next[root][i]);}while(!Q.empty()){int now = Q.front();Q.pop();for(int i = 0;i < 128;i++)if(next[now][i] == -1)next[now][i]=next[fail[now]][i];else{fail[next[now][i]]=next[fail[now]][i];Q.push(next[now][i]);}}}int num[100005];void query(string buf,int n){for(int i = 0;i < n;i++)num[i] = 0;int len=buf.length();int now=root;for(int i=0;i<len;i++){now=next[now][buf[i]];int temp = now;while( temp != root ){if(end[temp] != -1)//統計單詞次數num[end[temp]]+=end[temp];temp = fail[temp];}}int ans=0;for(int i = 0;i < n;i++)if(num[i] > 0){ans+=num[i];}cout<<ans<<endl;}};Trie ac;int main() {int t;cin>>t;while(t--){int n,m;cin>>n>>m;ac.init();for(int i=1;i<=n;i++)cin>>buf[i];for(int i = 0;i < m;i++){cin>>str;ac.insert(str,i);}ac.build();for(int i=1;i<=n;i++)ac.query(buf[i],m);}return 0; }總結
以上是生活随笔為你收集整理的hdu5384(AC自动机+纪录重复单词出现的次数)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hdu3699(不等式dfs)
- 下一篇: hdu5389(DP)