明明題目沒有說多組資料, 然後我就當作一組資料來做了。
看來看去**都沒有錯,但是一提交就wa,害我該了乙個下午。天啊!
去找題解才知道是多組資料。不要被省略」有多組資料「而欺騙了。
/* 題意:中文題,詳見hdu 3065
思路:套ac自動機模板。
注意:建trie樹時,字串的資訊(病毒編號)存放在最後乙個字母的
value中,病毒特徵碼只包含「英文大寫字元」,所以孩子節點只需26個
沒遇到一種病毒,則把(病毒出現次數的)陣列對應的值+1。
*/ #include#include#include#includeusing namespace std;
const int maxm=2000100;//**長度
const int maxn=50010;//病毒最多的需要的節點數
char web[maxm];//**串
char virus[1010][55];//病毒存放的陣列
int virusn[1010];//對應位置病毒出現的次數
struct trie
void init()//初始化
void insert(char s,int k)//建樹
x=child[x][s[i]-'a'];
} value[x]=k;//對應資訊存放到最後乙個字母中
} void build()//構建fail陣列
else
}while(!q.empty())
else
}} }
void query(char s)//**匹配
x=temp=child[x][s[i]-'a'];
while(temp!=root)
temp=fail[temp];
}} }
}ac;
int main()
ac.build();//構造fail
getchar();
cin.getline(web,maxm);//輸入**,可能包含空格等
ac.query(web);//匹配
for(int i=1;i<=n;i++)
{ if(virusn[i])//初始為0,只要出現過這種病毒則》0
{cout<
病毒侵襲持續中 AC自動機
傳送門 這裡闡述一下fail陣列的定義 對於 x 與 fail x 兩個點 fail x 到根的字串與從x往上相同字元的字串相同 可以說 fail x 到根的字串是x到根的字串的字尾 所以如果我們發現匹配傳可以匹配到x 那麼fail x fail fail x 都是可以匹配的 另外 如果我們匹配到了...
病毒侵襲持續中(AC自動機)
小t非常感謝大家幫忙解決了他的上乙個問題。然而病毒侵襲持續中。在小t的不懈努力下,他發現了網路中的 萬惡之源 這是乙個龐大的病毒 他有著好多好多的病毒,但是這個 包含的病毒很奇怪,這些病毒的特徵碼很短,而且只包含 英文大寫字元 當然小t好想好想為民除害,但是小t從來不打沒有準備的戰爭。知己知彼,百戰...
AC自動機(病毒侵襲 )
題目大意 中文題目 具體思路 ac自動機模板題,編號的時候注意,是按照給定的id進行編號的。然後輸出的時候注意去重,雖然按道理來講通過last陣列是不會有重複的,但是如果是這種情況,病毒模板aaa,然後給你乙個模板串aaaaa,這樣的話,就肯定會有重複的了,所以需要去重,其次輸出的時候按照公升序輸出...