這道題是個裸的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行每行乙個單詞。每個單詞...