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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

2017西安交大ACM小学期 敏感词汇[AC自动机]

發布時間:2023/12/3 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 2017西安交大ACM小学期 敏感词汇[AC自动机] 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

敏感詞匯

發布時間: 2017年7月5日 00:23?? 最后更新: 2017年7月6日 14:40?? 時間限制: 1500ms?? 內存限制: 128M

描述

我們知道,在進行聊天時,有些詞匯是敏感詞匯,含有敏感詞匯的內容是不允許被發送的。現在給定m個敏感詞匯,并給定一段文本,請將所有敏感詞匯都用星號替換掉。

輸入

包含多組數據。
每組數據第一行一個正整數m,表示有m個敏感詞匯。
接下來m行每行一個敏感詞匯,敏感詞匯僅包含小寫字母。
最后一行為文本,僅包含小寫字母。
每組數據保證敏感詞匯總長度不超過106,文本不超過106
總字符輸入量不超過107

輸出

對每組數據,輸出一行一個字符串,表示敏感詞匯都用星號替換掉后的文本。

樣例輸入1?復制 3 naive simple glasses glassesimplenaiveexcited 樣例輸出1 *****************excited

這是一個比較裸的AC自動機的題

這里要注意幾點:

1.不能邊檢測邊覆蓋,不然肯定會超時,所以我們用一個replace數組記錄下從當前這個位置應該向前覆蓋*的個數

2.在檢測到下一個字符,并且往前回溯的時候,只要搜索到第一個有效模式即可,因為剩下的模式長度只能更小,我們覆蓋大模式的時候,肯定就可以覆蓋掉小的模式

3.最后覆蓋的時候,從后往前掃描replace數組,可以在O(n)時間內完成覆蓋

代碼:

#include <cstdio> #include <cstring> #include <queue> using namespace std; const int MAXN = 1e6+7; int replace[MAXN]; #define LETTER 26 struct Trie{int num, fail,match;int next[LETTER];int dep; }pool[MAXN]; Trie* const trie = pool + 1; int cnt; void init(){cnt = 0;memset(pool, 0, 2 * sizeof(Trie));trie[0].fail = -1; } inline int convert(char c){return c - 'a'; } void build() {queue<int> q; q.push(0);while (!q.empty()){int t = q.front(); q.pop();for (int i = 0; i < LETTER; i++){int &cur = trie[t].next[i];if (cur){q.push(cur);trie[cur].fail = trie[trie[t].fail].next[i];trie[cur].match = trie[cur].num ? cur :trie[trie[cur].fail].match;}else cur = trie[trie[t].fail].next[i];}} } int search(char *s) {int ret = 0, cur = 0;for (int i = 0; s[i]; i++){cur = trie[cur].next[convert(s[i])];for (int temp = trie[cur].match; temp;temp = trie[trie[temp].fail].match){//ret += trie[temp].num;if(trie[temp].num){replace[i] = trie[temp].dep;break;}//trie[temp].num = 0;}}return ret; } void insert(char s[]){int cur = 0;for(int i = 0;s[i];i++){int &pos = trie[cur].next[convert(s[i])];if(!pos){pos = ++cnt;memset(&trie[cnt],0,sizeof(Trie));}trie[pos].dep = trie[cur].dep + 1;cur = pos;}trie[cur].num ++; }char pat[MAXN]; char str[MAXN]; int main(){int m;while(~scanf("%d",&m)){init();memset(replace,0,sizeof(replace));while(m--){scanf(" %s",pat);insert(pat);}build();scanf(" %s",str);int ans = search(str);//printf("%d\n",ans);int len = strlen(str);int cnt = 0;for(int i = len-1;i >= 0;i--){cnt = max(cnt,replace[i]);if(cnt){str[i] = '*';cnt--;}}puts(str);} }






總結

以上是生活随笔為你收集整理的2017西安交大ACM小学期 敏感词汇[AC自动机]的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。