HDU3065 AC自動機 AC感言

2021-07-26 20:20:37 字數 1743 閱讀 4017

fourth ac zi dong ji(aho-corasick automation) of life

9a(其實不止交了10發...) 感言:

一開始多組資料這種小資料還是...無傷大局,因為改完以後還是wa...

一:最後發現是wa在構造fail指標的時候在建立臨時指標查詢有沒有匹配到的fail,在沒有匹配到的時候,結點的fail的指標要指向根。

二(重要感言):

在查詢時,往上回溯fail指標的時候,fail指標是一定會最終回溯到根的,而且,比如當前查詢到的主串是abcdef,fail指標可能會一直傳遞最終到根,但是並不是都有效啊!這裡還要注意,fail指標傳遞過去,找到的是子串,還是本來那個串的字尾串,為什麼說是子串:如果有模式串abcd,abcdef,主串是acbdef,主串到d的時候已經處理掉了abcd,這個情況下是不會用到fail指標的功效了,或者這裡沒有有效的字尾串;什麼時候會用fail指標呢,如果有模式串cd,bcd,abcdef,主串是acbdef,那麼在主串到d的時候會通過fail指標找到bcd,然後在找到cd,所以我們能得出,fail指標的回溯,當前串(比如abcd)最後那個d是一直不會變的,可以說fail指標都是d的fail指標!

三:不要依賴模板...2cc

aaaooxxcc%daaaoen....endooxxcc%daaaoen....endooxxcc%daaaoen....end

2abcde

bcdabcd

2abcde

bcdabcdef

//#include #include#include#include#include#includeusing namespace std;

typedef long long ll;

/*題意:

求不同的病毒出現的次數,未出現的不需要輸出

aaa其中aa出現2次;

思路:那我存的應該是編號了,編號都不同。

*/const int n=5e4+10;

struct trie

;trie q[n],*root;

int tol,ans[1010],n;

char ss[1010][51];

trie* creat()

void insert(char *str,int id)

p->id=id;

}void build_ac()

temp=temp->fail;

}if(temp==null) //如果沒有找到匹配的,則fail指向根

p->next[i]->fail=root;

}que.push(p->next[i]);}}

}}char word[2000010];

void query()

index=word[i]-'a';

while(p->next[index]==null && p!=root)

p=p->fail;

p=p->next[index];

if(p==null)

p=root;

trie *temp=p;

while(temp!=root) //回溯到根

}for(int i=1; i<=n; i++)

}int main()

getchar();

build_ac();

gets(word);

query();

}return 0;

}

HDU3065 AC自動機 AC感言

fourth ac zi dong ji aho corasick automation of life 9a 其實不止交了10發.感言 一開始多組資料這種小資料還是.無傷大局,因為改完以後還是wa.一 最後發現是wa在構造fail指標的時候在建立臨時指標查詢有沒有匹配到的fail,在沒有匹配到的時...

病毒侵襲持續中 HDU 3065 ac自動機

小t非常感謝大家幫忙解決了他的上乙個問題。然而病毒侵襲持續中。在小t的不懈努力下,他發現了網路中的 萬惡之源 這是乙個龐大的病毒 他有著好多好多的病毒,但是這個 包含的病毒很奇怪,這些病毒的特徵碼很短,而且只包含 英文大寫字元 當然小t好想好想為民除害,但是小t從來不打沒有準備的戰爭。知己知彼,百戰...

病毒侵襲持續中 HDU 3065 AC自動機

小t非常感謝大家幫忙解決了他的上乙個問題。然而病毒侵襲持續中。在小t的不懈努力下,他發現了網路中的 萬惡之源 這是乙個龐大的病毒 他有著好多好多的病毒,但是這個 包含的病毒很奇怪,這些病毒的特徵碼很短,而且只包含 英文大寫字元 當然小t好想好想為民除害,但是小t從來不打沒有準備的戰爭。知己知彼,百戰...