求助自动AC机
查看原帖
求助自动AC机
81238
MCAdam楼主2020/10/20 14:44

#20 MLE

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <vector>
using namespace std;
const int N=4e5+10,M=8e5+10;
int tot,cnt=1,stp;
vector<char>s[N],tmp;
vector< pair<int,int> >ask[M];
int ed[M],que[M],fir[M],dfn[M][2],rt[M],ans[N];
struct edge
{
	int to;
	int nxt;
}e[M];
inline void add(int x,int y)
{
	e[++tot].to=y; e[tot].nxt=fir[x]; fir[x]=tot;
}
struct ACauto
{
	int son1[27];
	int son2[27];
	int fail;
}t[M];
inline void insert(vector<char>S,int id)
{
	int p=1,len=S.size();
	for(int i=0;i<len;i++)
	{
		int ch=S[i]-'a';
		if(!t[p].son1[ch]) t[p].son1[ch]=++cnt;
		p=t[p].son1[ch];
	}
	ed[id]=p;
}
inline void getfail()
{
	for(int i=0;i<26;i++)
		t[0].son2[i]=1;
	que[1]=1,t[1].fail=0;
	int head=1,tail=1;
	while(head<=tail)
	{
		int p=que[head++];
		for(int i=0;i<26;i++)
		{
			int q=t[p].son2[i],nxt=t[p].fail;
			if(!q){ t[p].son2[i]=t[nxt].son2[i]; continue; }
			t[q].fail=t[nxt].son2[i];
			que[++tail]=q;
		}
	}
}
inline int lowbit(int x)
{
	return x&(-x);
}
inline void change(int x,int c)
{
	for(int i=x;i<=cnt+1;i+=lowbit(i))
		rt[i]+=c;
}
inline int query(int x)
{
	int res=0;
	for(int i=x;i>=1;i-=lowbit(i))
		res+=rt[i];
	return res;
}
inline void dfs1(int p)
{
	dfn[p][0]=++stp;
	for(int i=fir[p];i;i=e[i].nxt)
		dfs1(e[i].to);
	dfn[p][1]=stp;
}
inline void dfs2(int p)
{
	change(dfn[p][0],1);
	for(int i=0;i<ask[p].size();i++)
	{
		int x=ask[p][i].first;
		ans[ask[p][i].second]=query(dfn[x][1])-query(dfn[x][0]-1);
	}
	for(int i=0;i<26;i++)
		if(t[p].son1[i]) dfs2(t[p].son1[i]);
	change(dfn[p][0],-1);
}
int main()
{
	int T,n=0,m,opt,pos; char ch[N];
	scanf("%d",&T);
	for(int i=1;i<=T;i++)
	{
		scanf("%d",&opt);
		if(opt==1) n++;
		else 
		{
			scanf("%d",&pos);
			s[++n]=s[pos];
		}
		scanf("%s",ch);
		s[n].push_back(ch[0]);
	}
	for(int i=1;i<=n;i++)
		insert(s[i],i);
	scanf("%d",&m);
	for(int i=1;i<=m;i++)
	{
		scanf("%d%s",&pos,ch);
		tmp.clear();
		for(int j=0;j<strlen(ch);j++)
			tmp.push_back(ch[j]);
		insert(tmp,n+i);
		ask[ed[pos]].push_back(make_pair(ed[n+i],i));
	}
	for(int i=1;i<=cnt;i++)
		for(int j=0;j<26;j++)
			t[i].son2[j]=t[i].son1[j];
	getfail();
	for(int i=1;i<=cnt;i++)
		add(t[i].fail,i);
	dfs1(0),dfs2(1);
	for(int i=1;i<=m;i++)
		printf("%d\n",ans[i]);
	return 0;
}
2020/10/20 14:44
加载中...