AC自动机RE求助
  • 板块学术版
  • 楼主NaiHe_
  • 当前回复0
  • 已保存回复0
  • 发布时间2022/5/10 17:55
  • 上次更新2023/10/28 01:45:25
查看原帖
AC自动机RE求助
456711
NaiHe_楼主2022/5/10 17:55

以下是代码

#include<iostream>
#include<algorithm>
#include<queue>
#include<string>
using namespace std;
struct Node
{
	Node *ch[26],*nxt;
	int val;
}*ROOT,*root;
int n;
string s;
void insert(string &s)
{
	int len=s.size(),c;
	Node *p=root;
	for(int i=0;i<len;++i)
	{
		c=s[i]-'a';
		if(p->ch[c]==NULL)
			p->ch[c]=new Node;
		p=p->ch[c];
	}
	++p->val;
}
void build_AC()
{
	for(int i=0;i<26;++i)
		ROOT->ch[i]=root;
	root->nxt=ROOT;
	queue<Node*> q;
	q.push(root);
	while(!q.empty())
	{
		Node *u=q.front();
		q.pop();
		for(int i=0;i<26;++i)
			if(u->ch[i]==NULL)
				u->ch[i]=u->nxt->ch[i];
			else
			{
				u->ch[i]->nxt=u->nxt->ch[i];
				q.push(u);
			}
	}
}
int query(string &s)
{
	int len=s.size(),ans=0;
	Node *p=root;
	for(int i=0;i<len;++i)
	{
		for(Node *i=p;i!=NULL&&i->val!=-1;i=i->nxt)
			ans+=i->val,i->val=-1;
		p=p->ch[s[i]-'a'];
	}
	return ans;
}
int main()
{
	cin>>n;
	for(int i=1;i<=n;++i)
	{
		cin>>s;
		insert(s);
	}
	cin>>s;
	build_AC();
	cout<<query(s);
	return 0;
}

经过debug,发现在insert()函数中申请新空间时会爆(本人只发现了这里)

2022/5/10 17:55
加载中...