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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

病毒侵袭(HDU-2896)

發(fā)布時(shí)間:2025/3/17 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 病毒侵袭(HDU-2896) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Problem Description

當(dāng)太陽的光輝逐漸被月亮遮蔽,世界失去了光明,大地迎來最黑暗的時(shí)刻。。。。在這樣的時(shí)刻,人們卻異常興奮——我們能在有生之年看到500年一遇的世界奇觀,那是多么幸福的事兒啊~~?
但網(wǎng)路上總有那么些網(wǎng)站,開始借著民眾的好奇心,打著介紹日食的旗號(hào),大肆傳播病毒。小t不幸成為受害者之一。小t如此生氣,他決定要把世界上所有帶病毒的網(wǎng)站都找出來。當(dāng)然,誰都知道這是不可能的。小t卻執(zhí)意要完成這不能的任務(wù),他說:“子子孫孫無窮匱也!”(愚公后繼有人了)。?
萬事開頭難,小t收集了好多病毒的特征碼,又收集了一批詭異網(wǎng)站的源碼,他想知道這些網(wǎng)站中哪些是有病毒的,又是帶了怎樣的病毒呢?順便還想知道他到底收集了多少帶病毒的網(wǎng)站。這時(shí)候他卻不知道何從下手了。所以想請(qǐng)大家?guī)蛶兔ΑP又是個(gè)急性子哦,所以解決問題越快越好哦~~?

Input

第一行,一個(gè)整數(shù)N(1<=N<=500),表示病毒特征碼的個(gè)數(shù)。?
接下來N行,每行表示一個(gè)病毒特征碼,特征碼字符串長(zhǎng)度在20—200之間。?
每個(gè)病毒都有一個(gè)編號(hào),依此為1—N。?
不同編號(hào)的病毒特征碼不會(huì)相同。?
在這之后一行,有一個(gè)整數(shù)M(1<=M<=1000),表示網(wǎng)站數(shù)。?
接下來M行,每行表示一個(gè)網(wǎng)站源碼,源碼字符串長(zhǎng)度在7000—10000之間。?
每個(gè)網(wǎng)站都有一個(gè)編號(hào),依此為1—M。?
以上字符串中字符都是ASCII碼可見字符(不包括回車)。?

Output

依次按如下格式輸出按網(wǎng)站編號(hào)從小到大輸出,帶病毒的網(wǎng)站編號(hào)和包含病毒編號(hào),每行一個(gè)含毒網(wǎng)站信息。?
web 網(wǎng)站編號(hào): 病毒編號(hào) 病毒編號(hào) …?
冒號(hào)后有一個(gè)空格,病毒編號(hào)按從小到大排列,兩個(gè)病毒編號(hào)之間用一個(gè)空格隔開,如果一個(gè)網(wǎng)站包含病毒,病毒數(shù)不會(huì)超過3個(gè)。?
最后一行輸出統(tǒng)計(jì)信息,如下格式?
total: 帶病毒網(wǎng)站數(shù)?
冒號(hào)后有一個(gè)空格。?

Sample Input

3
aaa
bbb
ccc
2
aaabbbccc
bbaacc

Sample Output

web 1: 1 2 3
total: 1

思路:字符串多模版匹配,要求輸出每一個(gè)單詞在每一個(gè)文本中的出現(xiàn)次數(shù),使用 set 記錄已匹配到的模式串編號(hào),然后遞歸輸出即可,此外由于字符為 ASCII 碼,因此字典樹的第二維要開到 128

Source Program

#include<iostream> #include<cstdio> #include<cstdlib> #include<string> #include<cstring> #include<cmath> #include<ctime> #include<algorithm> #include<utility> #include<stack> #include<queue> #include<vector> #include<set> #include<map> #define PI acos(-1.0) #define E 1e-9 #define INF 0x3f3f3f3f #define LL long long const int MOD=10007; const int N=100000+5; const int dx[]= {-1,1,0,0}; const int dy[]= {0,0,-1,1}; using namespace std;struct AC_Automata{int tire[N][128];//字典樹int val[N];//字符串結(jié)尾標(biāo)記int fail[N];//失配指針int last[N];//last[i]=j表j節(jié)點(diǎn)表示的單詞是i節(jié)點(diǎn)單詞的后綴,且j節(jié)點(diǎn)是單詞節(jié)點(diǎn)int tot;//編號(hào)void init(){//初始化0號(hào)點(diǎn)tot=1;val[0]=fail[0]=last[0]=0;memset(tire[0],0,sizeof(tire[0]));}void insert(char *s,int v){//構(gòu)造trie與val數(shù)組,v需非0,表示一個(gè)單詞節(jié)點(diǎn)int len=strlen(s);int root=0;for(int i=0;i<len;i++){int id=s[i];if(tire[root][id]==0){tire[root][id]=tot;memset(tire[tot],0,sizeof(tire[tot]));val[tot++]=0;}root=tire[root][id];}val[root]=v;}void build(){//構(gòu)造fail與lastqueue<int> q;last[0]=fail[0]=0;for(int i=0;i<128;i++){int root=tire[0][i];if(root!=0){fail[root]=0;last[root]=0;q.push(root);}}while(!q.empty()){//bfs求failint k=q.front();q.pop();for(int i=0;i<128;i++){int u=tire[k][i];if(u==0)continue;q.push(u);int v=fail[k];while(v && tire[v][i]==0)v=fail[v];fail[u]=tire[v][i];last[u]=val[fail[u]]?fail[u]:last[fail[u]];}}}void print(int i,set<int> &st){//遞歸打印與結(jié)點(diǎn)i后綴相同的前綴節(jié)點(diǎn)編號(hào)if(val[i]){if( st.find(i)==st.end() )st.insert(val[i]);print(last[i],st);}}void query(char *s,set<int> &st){//匹配int len=strlen(s);int j=0;for(int i=0;i<len;i++){int id=s[i];while(j && tire[j][id]==0)j=fail[j];j=tire[j][id];if(val[j])print(j,st);else if(last[j])print(last[j],st);}} }ac; char P[N]; char T[N]; set<int>::iterator it; int main(){int n;scanf("%d",&n);ac.init();for(int i=1;i<=n;i++){scanf("%s",P);ac.insert(P,i);}ac.build();int m;scanf("%d",&m);int total=0;for(int i=1;i<=m;i++){scanf("%s",&T);set<int> st;//保存文本串已經(jīng)匹配到的模式串編號(hào)ac.query(T,st);if(!st.empty()){total++;printf("web %d:",i);for(set<int>::iterator it=st.begin();it!=st.end();it++)printf(" %d",(*it));printf("%\n");}}printf("total: %d\n",total);return 0; }

?

總結(jié)

以上是生活随笔為你收集整理的病毒侵袭(HDU-2896)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

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