省选专练(学习)AC自动机

我好菜啊

AC自动机都不会

AC自动机可以干什么:

用一个模板串匹配多个子串。

这便让AC自动机可以干许多KMP和Tri树不能干的事。

AC自动机的构造

首先建立一颗Trie树。

其次利用KMP的思想(Trie树上明显有许多重复的子路径)

建立一条Fail边

使得这些子路径没有白跑。

#include
using namespace std;
const int N=1e6+100;
struct Results{
	int num;
	int pos;
}Ans[N];
string s[N];
bool operator < (Results A,Results B){
	return A.num>B.num||(A.num==B.num&&A.pos Q;
		for(int i=0;i<27;i++){
			if(AC[0].vis[i]){
				AC[AC[0].vis[i]].fail=0;
				Q.push(AC[0].vis[i]);
			}
		}
		while(!Q.empty()){
			int u=Q.front();
			Q.pop();
			for(int i=0;i<27;i++){
				if(AC[u].vis[i]){
					AC[AC[u].vis[i]].fail=AC[AC[u].fail].vis[i];
					Q.push(AC[u].vis[i]);
				}
				else AC[u].vis[i]=AC[AC[u].fail].vis[i];
			}
		}
	}
	inline void Query(string S){
		int R=S.length();
		int now=0;
		int ans=0;
		for(int i=0;i>n;
		if(n==0)break;
		ACM.cnt=0;
//		cout<>s[i];
//			cout<<"hello "<<'\n';
			Ans[i].num=0;
			Ans[i].pos=i;
			ACM.Build(s[i],i);
		}
//		cout<<"here"<<'\n';
		ACM.AC[0].fail=0;
		ACM.Get_Fail();
		string Key;
		cin>>Key;
		ACM.Query(Key);
		sort(&Ans[1],&Ans[n+1]);
//		for(int i=1;i<=n;i++){
//			cout<

 

转载于:https://www.cnblogs.com/Leo-JAM/p/10079195.html

你可能感兴趣的:(省选专练(学习)AC自动机)