如题。这题有人也说过加强数据,但都因为这题是“简单版”而放弃。但这题毕竟是为了验证正确性,不正确的代码都可以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