只有52pts,不知道问题出在哪
查看原帖
只有52pts,不知道问题出在哪
456711
NaiHe_楼主2022/7/11 12:40

RT,代码如下:

#include<iostream>
#include<algorithm>
#include<queue>
#include<cstring>
using namespace std;
struct Node
{
	Node *fail,*ch[30];
	int val,id,in,idx;
	Node()
	{
		val=id=in=idx=0;
		fail=NULL;
		for(int i=0;i<26;++i)
			ch[i]=NULL;
	}
}*ROOT=new Node(),*root=new Node();
int n,cnt;
int ans[200010];
string s;
Node *item=new Node[200010];
void insert(const string &s,const int &id)
{
	Node *p=root;
	int len=s.size(),c;
	for(int i=0;i<len;++i)
	{
		c=s[i]-'a';
		if(p->ch[c]==NULL)
		{
			p->ch[c]=&item[++cnt];
			p->ch[c]->idx=cnt;
		}
		p=p->ch[c];
	}
	p->id=id;
}
void build_AC()
{
	root->fail=ROOT;
	for(int i=0;i<26;++i)
		ROOT->ch[i]=root;
	queue<Node*> q;
	q.push(root);
	while(!q.empty())
	{
		Node *p=q.front();
		q.pop();
		for(int i=0;i<26;++i)
			if(p->ch[i]==NULL)
				p->ch[i]=p->fail->ch[i];
			else
			{
				p->ch[i]->fail=p->fail->ch[i];
				q.push(p->ch[i]);
			}
	}
}
void query(const string &s)
{
	Node *p=root;
	int len=s.size(),c;
	for(int i=0;i<len;++i)
	{
		c=s[i]-'a';
		p=p->ch[c];
		++p->val;
	}
}
void topo(Node *p)
{
	while(!p->in)
	{
		p->fail->val+=p->val;
		--(p=p->fail)->in;
	}
}
int main()
{
	cin>>n;
	for(int i=1;i<=n;++i)
	{
		cin>>s;
		insert(s,i);
	}
	build_AC();
	cin>>s;
	query(s);
	queue<Node*> que;
	for(Node *i=item+1;i<=item+cnt;++i)
		++i->fail->in;
	for(Node *i=item+1;i<=item+cnt;++i)
		if(!i->in)
			que.push(i);
	while(!que.empty())
	{
		Node *p=que.front();
		que.pop();
		topo(p);
	}
	for(Node *i=item+1;i<=item+cnt;++i)
		if(i->id)
			ans[i->id]=i->val;
	for(int i=1;i<=n;++i)
		cout<<ans[i]<<endl;
	return 0;
}
2022/7/11 12:40
加载中...