BZOJ 3172 單詞 (AC自動機)

2021-06-28 20:32:47 字數 776 閱讀 7623

這道題是個裸的ac自動機,但是我還是調了很久qaq。首先如果我們直接用每個單詞來匹配的,時間不是很理想。這道題要用到ac自動機的衍生物:fail樹(我也是做這道題才知道有這個東西= =||)。fail樹有這麼乙個結論:乙個字串出現的次數等於以它為根節點的fail樹的子樹中所有節點的cnt的和。根據這個結論,我們在新增字串時,每新增乙個乙個字元,該節點的cnt++。然後建fail樹。最後從葉子節點從下至上的統計cnt即可。

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

int n;

char s[1000000+5];

struct trie*hehe[210];

trie *get()

trie *creat(trie *root,char *s)

return p;

}queueq;

stacksai;

void built_ac(trie *root)

t=t->fail;

}if(t==null)p->next[i]->fail=root;

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

}} }

while(!sai.empty())

}int main()

built_ac(root);

for(int i=1;i<=n;i++)printf("%d\n",hehe[i]->cnt);

return 0;

}

bzoj3172 單詞 AC自動機

感覺以前寫過。bzoj上不去我也不知道 跑一遍ac自動機,每乙個節點儲存一下屬於多少字串,為它的權值。然後乙個節點表示的字串在整個字典中出現的次數相當於其在fail樹中的子樹的權值的和。ac自動機不要寫掛就好了。ac 如下 include include include define n 11000...

bzoj3172 單詞 AC自動機

有n個單詞組成了一篇文章,求每個單詞在這篇文章中出現了多少次。多個字串匹配的問題,建立ac自動機。如果某個單詞在i節點出現了,那麼在i節點fail指標所指節點也出現過。code include include using namespace std const int max n 1000005 s...

Bzoj3172 單詞(AC自動機)

time limit 10 sec memory limit 512 mb submit 5051 solved 2467 某人讀 一篇 是由許多單詞組成。但他發現乙個單詞會在 中出現很多次,現在想知道每個單詞分別在 中出現多少次。第乙個乙個整數n,表示有多少個單詞,接下來n行每行乙個單詞。每個單詞...