萌新求助AC不了的AC自动机
查看原帖
萌新求助AC不了的AC自动机
146837
吴铭轼楼主2021/1/3 15:52

RT

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <string>
#include <cstring>
#include <queue>
#include <vector>
#include <map>
#include <stdlib.h>
#include <time.h>
using namespace std;
int CtoI[1003];
struct Trie{
	int son[30];
	int sum=0;
	int fail;
	int vis=0,revis=0;
	int flag;
	int ru=0;
}a[1000006];
int cnt=1;
void init()
{
	for(int i=1;i<=cnt;i++)
	{
		a[i].vis=a[i].revis=0;
	}
}
int getint(char c)
{
	return CtoI[c];
}
void add(string s,int num) 
{
	int now=1;
	for(int i=0;s[i];i++)
	{
		if(!a[now].son[getint(s[i])])
		a[now].son[getint(s[i])]=++cnt;
		now=a[now].son[getint(s[i])];
	}
	a[now].sum++;
	if(!a[now].flag )
	a[now].flag=num;
}
bool find(string s)
{
	int now=1;
	for(int i=0;s[i];i++)
	{
		if(!a[now].son[getint(s[i])])
		return 0;
		now=a[now].son[getint(s[i])];
	}
	return a[now].sum;
}
void biuld()
{
	queue<int> q;
	for(int i=0;i<30;i++)
	a[0].son[i]=1;
	//a[0].ru++;
	/*for(int i=0;i<30;i++)
	{
		if(a[1].son[i])
		{
			a[a[1].son[i]].fail =1;
			a[1].ru ++;
			q.push(a[1].son[i]);
		}
	}*/
	q.push(1); 
	while(!q.empty())
	{
		int u=q.front();
		q.pop();
		for(int i=0;i<30;i++)
		{
			int v=a[u].son[i];
			if(!v)
			a[u].son[i]=a[a[u].fail].son[i] ;
			else
			{
				a[v].fail=a[a[u].fail ].son[i];
				//a[a[a[u].fail].son[i]].ru++;
				q.push(v);
			}
		}
	}
}
void solve(string s)
{
	init();
	int now=1;
	for(int i=0;s[i];i++)
	{
		now=a[now].son[getint(s[i])];
		if(a[now].sum )
		cout<<now<<endl;
		//cout<<now<<endl;
		a[now].vis++;
	}
}
void topo()
{
	for(int i=1;i<=cnt;i++)
	a[a[i].fail ].ru++;
	queue<int> q;
	//cout<<cnt<<endl;
	for(int i=1;i<=cnt;i++)
	if(!a[i].ru )
	{
		q.push(i);
		//cout<<i<<endl;
	}
	while(!q.empty())
	{
		int u=q.front();
		q.pop();
		int v=a[u].fail;
		a[v].vis+=a[u].vis;
		a[v].ru--;
		if(!a[v].ru )
		{
			//if(a[u].vis&&a[v].sum )
			//cout<<u<<" "<<v<<endl;
			q.push(v);
		}
	}
}
int gettime(string s)
{
	solve(s);
	topo();
	int ans=0;
	for(int i=1;i<=cnt;i++)
	ans+=a[i].sum*a[i].vis;
	return ans;
}
int getsum(string s)
{
	solve(s);
	topo();
	int ans=0;
	for(int i=1;i<=cnt;i++)
	{
		if(!a[i].sum)
		continue;
		//if(a[i].vis )
		//cout<<i<<" "<<endl;
	}
	for(int i=1;i<=cnt;i++)
	ans+=a[i].sum*(a[i].vis!=0);
	return ans;
}
int getmax(string s)
{
	solve(s);
	topo();
	int ans=0;
	for(int i=1;i<=cnt;i++)
	{
		if(a[i].sum*a[i].vis>a[ans].sum*a[ans].vis )
		ans=i;
	}
	return ans;
}
int n;
int main()
{
	for(int i='a';i<='z';i++)
	CtoI[i]=i-'a';
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		string s;
		cin>>s;
		add(s,i);
	}
	biuld();
	string s;
	cin>>s;
	cout<<getsum(s);
	return 0;
}
2021/1/3 15:52
加载中...