建议加强数据
查看原帖
建议加强数据
184055
Beyond616楼主2020/10/8 21:50

如题。这题有人也说过加强数据,但都因为这题是“简单版”而放弃。但这题毕竟是为了验证正确性,不正确的代码都可以AC总不是很好吧。毕竟加强版有人还做不出来,只想背个模板,但很容易被这题误导背了个错的。

#include<queue>
#include<cstdio>
#include<cstring>
#define N (long long) 1e6+23
using namespace std;
struct ac
{
	long long vis[26],fail;
}AC[N];
char s[N];
long long End[N],tot;
long long Run(long long &now,char c)
{
    now=AC[now].vis[c-'a'];
	long long pii=0;long long u=now;
	while (u&&End[u])
	{
		pii+=End[u];
		End[u]=0;
		u=AC[u].fail;
	}
	return pii;
}
void Get_string(char s[],long long len,long long now)
{
	for (long long i=0;i<len;++i)
	{
		long long c=s[i]-'a';
		if (AC[now].vis[c]) now=AC[now].vis[c];
		else {
			AC[now].vis[c]=++tot;
			now=tot;
		}
	}
	++End[now];
}
void Get_fail()
{
	queue<long long>Q;
	for (long long i=0;i<26;++i)
	if (AC[0].vis[i])
	{
		AC[AC[0].vis[i]].fail=0;
		Q.push(AC[0].vis[i]);
	}
	while (!Q.empty())
	{
		long long u=Q.front(); Q.pop();
//		for (long long i=0;i<26;++i) printf("AC[%lld].vis[%c]=%lld\n",u,i+'a',AC[u].vis[i]);
		for (long long i=0;i<26;++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];
	}
}
/*
1
2
she 
he
she
*/
int main()
{
	long long n,t=1,now=0,ans=0;
//	scanf("%lld",&t);
	while (t--)
	{
	scanf("%lld",&n);
	memset(AC,0,sizeof(AC));
	memset(End,0,sizeof(End));
	memset(s,0,sizeof(s));
	tot=ans=0;
	while (n--)
	{
		scanf("%s",s);
		Get_string(s,strlen(s),0);
	}
	Get_fail();
	char c=getchar();
	while (c<'a'||c>'z') c=getchar();
	while (c>='a'&&c<='z')
	{
//		printf("%lld=>",now);
		ans+=Run(now,c);
//		printf("%lld\n",now);
		c=getchar();
	}
	printf("%lld",ans);
	}
}
3
she
h
e
she
std:3
输出:2
2020/10/8 21:50
加载中...