锰锌刚学ACAM求教
查看原帖
锰锌刚学ACAM求教
1249322
Elaina_0楼主2024/9/5 10:41

样例过不了却AC

加上注释语句 cnt=1 后正常

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define ll long long
#define rd read()
#define mkp make_pair
#define psb push_back
#define Elaina 0
#define mst(a,b) memset((a),(b),sizeof(a))
#define random(a,b) (1ll*rand()*rand()*rand()%((b)-(a)+1)+(a))
inline ll read(){
	ll f=1,x=0;
	char ch=getchar();
	for(;!isdigit(ch);ch=getchar()) f=(ch=='-'?-1:1);
	for(;isdigit(ch);ch=getchar()) x=(x<<3)+(x<<1)+ch-'0';
	return f*x;
}
const int mod=1e9+7;
const int N=1e6+100;
const int inf=0x7fffffff;

int n,m;
char s[N];

namespace AC{
	int cnt;
	struct ciallo{
		int son[26],flg,fail;
	}tr[N];
	
	void insert(char *s){
		int x=0,len=strlen(s);
		for(int i=0;i<len;i++){
			int y=s[i]-'a';
			if(!tr[x].son[y]){
				tr[x].son[y]=++cnt;
			}
			x=tr[x].son[y];
		}
		tr[x].flg++;
	}
	
	void getFail(){
		queue<int> q;
		for(int i=0;i<26;i++){
			if(tr[0].son[i]){
				q.push(tr[0].son[i]);
			}
		}
		
		while(!q.empty()){
			int x=q.front();
			q.pop();
			for(int i=0;i<26;i++){
				int y=tr[x].son[i],fail=tr[x].fail;
				if(!y){
					tr[x].son[i]=tr[fail].son[i];
				}else{
					tr[y].fail=tr[fail].son[i];
					q.push(y);
				}
			}
		}
	}
	
	int query(char *s){
		int x=0,ans=0,len=strlen(s);
		for(int i=0;i<len;i++){
			int y=s[i]-'a',k=tr[x].son[y];
			while(k>1 && tr[k].flg!=-1){
				ans+=tr[k].flg;
				tr[k].flg=-1;
				k=tr[k].fail;
			}
			x=tr[x].son[y];
		}
		return ans;
	}
};
using namespace AC;

signed main(){
//	cnt=1;
	n=rd;
	for(int i=1;i<=n;i++){
		scanf("%s",s);
		insert(s);
	}
	getFail();
	scanf("%s",s);
	printf("%lld\n",query(s));
	return Elaina;
}
2024/9/5 10:41
加载中...