當太陽的光輝逐漸被月亮遮蔽,世界失去了光明,大地迎來最黑暗的時刻。。。。在這樣的時刻,人們卻異常興奮——我們能在有生之年看到500年一遇的世界奇觀,那是多麼幸福的事兒啊~~
但網路上總有那麼些**,開始藉著民眾的好奇心,打著介紹日食的旗號,大肆傳播病毒。小t不幸成為受害者之一。小t如此生氣,他決定要把世界上所有帶病毒的**都找出來。當然,誰都知道這是不可能的。小t卻執意要完成這不能的任務,他說:「子子孫孫無窮匱也!」(愚公後繼有人了)。
萬事開頭難,小t收集了好多病毒的特徵碼,又收集了一批詭異**的原始碼,他想知道這些**中哪些是有病毒的,又是帶了怎樣的病毒呢?順便還想知道他到底收集了多少帶病毒的**。這時候他卻不知道何從下手了。所以想請大家幫幫忙。小t又是個急性子哦,所以解決問題越快越好哦~~
input第一行,乙個整數n(1<=n<=500),表示病毒特徵碼的個數。
接下來n行,每行表示乙個病毒特徵碼,特徵碼字串長度在20—200之間。
每個病毒都有乙個編號,依此為1—n。
不同編號的病毒特徵碼不會相同。
在這之後一行,有乙個整數m(1<=m<=1000),表示**數。
接下來m行,每行表示乙個**原始碼,原始碼字串長度在7000—10000之間。
每個**都有乙個編號,依此為1—m。
以上字串中字元都是ascii碼可見字元(不包括回車)。
output依次按如下格式輸出按**編號從小到大輸出,帶病毒的**編號和包含病毒編號,每行乙個含毒**資訊。
web **編號: 病毒編號 病毒編號 …
冒號後有乙個空格,病毒編號按從小到大排列,兩個病毒編號之間用乙個空格隔開,如果乙個**包含病毒,病毒數不會超過3個。
最後一行輸出統計資訊,如下格式
total: 帶病毒**數
冒號後有乙個空格。
sample input
3sample outputaaabbb
ccc2
aaabbbccc
bbaacc
web 1: 1 2 3total: 1
題解:ac自動機板題;垃圾題目,卡我空間,卡我常數,卡我格式。。。只要記錄有哪些單詞出現過就行了。
#includeusingview codenamespace
std;
#define maxn 500005
intn,t;
char s[maxn<<1
];
int ch[maxn][26
],fail[maxn],val[maxn],last[maxn];
int times[10005],cnt[10005]; //
每個單詞出現次數
int tot,num; //
單詞總數以及單詞出現了幾個
void
init()
int idx(char c)
void insert(char*s,int v) //
插入
u=ch[u][c];
} if(val[u]) times[val[u]]++;//
重複的模式串
else val[u]=v,times[v]=1
; }
void
getfail()
} while(!q.empty())
q.push(u);
int v=fail[r];
fail[u]=ch[v][c];
last[u] = val[fail[u]]?fail[u]:last[fail[u]];
} }
}
void print(int i,int
j)
} void find(char *t)
}
intmain()
getfail();
scanf("%s
",s);
find(s);
cout
}return
0;
}
hdu2896 病毒侵襲
剛剛看完ac自動兩天就發現了這道自動機的題目,這題不是很難,但是有幾個細節需要注意一下,首先 中的病毒型別不能重複,也就是說沒有可能出現兩個同樣的病毒,我的處理方法是利用set這樣的話判重和排序都省了,其次輸出的 編號和最終的病毒 數不是一樣的 我就是卡在這裡一直wa 爆棧的童鞋記得size是128...
HDU 2896 病毒侵襲
那什麼可見字元是坑爹的吧 include include include include include include include include include include include include include include include include include i...
hdu 2896 病毒侵襲
本題需要注意幾個方面 1 字元的範圍是可見的ascll碼字元,陣列要開到127。2 雖然題目的資料弱了,但是自己要考慮的周全。資料一 2 sherhe2 shesher答案 web 1 2 web 2 1 2 total 2資料二 2aaa 1aaaa答案 web 1 1 2 total 1 inc...