请求加强数据(我hack我自己)
查看原帖
请求加强数据(我hack我自己)
279095
gargantuar楼主2021/7/17 17:32

rt,下方代码可A此题

#include<algorithm>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<queue>
using namespace std;
char name[1000003],f[1000003];
int cont,n,m;
struct nd {
	int cnt,nt[30],fail;
	bool end;
} t[800006];
void insert() {
	scanf("%s",name+1);
	int v,l=strlen(name+1),now=0;
	//printf("%dl",l);
	for(int i=1; i<=l; ++i) {
		v=name[i]-'a';
		if(!t[now].nt[v])t[now].nt[v]=++cont;
		//printf("znow%d  v%d %d n \n",now,v,t[now].nt[v]);
		now=t[now].nt[v];
	}
	//printf("%d nowzzz\n",now);
	t[now].end=1;
	++t[now].cnt;
}
void fa() {
	queue<int>q;
	//q.push(0);
	for(int i=0; i<26; ++i) {
		if(t[0].nt[i])t[t[0].nt[i]].fail=0,q.push(t[0].nt[i]);
	}
	int now,next;
	while(!q.empty()) {
		now=q.front();
		q.pop();
		for(int i=0; i<26; ++i) {
			next=t[now].nt[i];
			if(next){
				t[next].fail=t[t[now].fail].nt[i];
				q.push(next);
			}
			else {
				t[now].nt[i]=t[t[now].fail].nt[i];
				//printf("del n%d v%d n%d\n",next,i,t[next].nt[i]);
			}
		}
	}
}
int AChicken(){
	scanf("%s",f+1);
	int len=strlen(f+1),now=0,v,ans=0;
	for(int i=1;i<=len;++i){
		v=f[i]-'a';
		//printf("now%d v%d %c %d f%d\n",now,v,f[i],t[now].nt[v],t[now].fail);
		now=t[now].nt[v];
		if(t[now].cnt){
			ans+=t[now].cnt;
			t[now].cnt=0;
		}
	}
	return ans;
}
int main() {
	int ls;
	scanf("%d",&n);
	for(int i=1; i<=n; ++i)insert();
	fa();
	printf("%d",AChicken());
	return 0;
}

但以下数据会错误。

输入

3
abc
bc
c
abc

应当输出

3

实际输出

1
2021/7/17 17:32
加载中...