萌新求助WA自动机
查看原帖
萌新求助WA自动机
340632
Cry_For_theMoon楼主2021/3/8 22:33

写的树上差分,没暴力跳 fail,但不知道为啥一直WA 56pts(数据不能下也找不出来bug)

求神仙们捉虫

#include<bits/stdc++.h>
#define rep(i,a,b) for(ll i=(a);i<=(b);i++)
#define per(i,a,b) for(ll i=(a);i>=(b);i--)
#define Max(a,b) (a>b?a:b)
#define Min(a,b) (a<b?a:b)
#define next Cry_For_theMoon
#define il inline
typedef long long ll;
using namespace std;
const int MAXN=2e5+10,MAXM=2e6+10;
int n;
char s[MAXN],t[MAXM];
struct ACM{
	int ch[MAXN][26],fail[MAXN],w[MAXN],pos[MAXN],vis[MAXN],tot;
	queue<int>q;
	void Insert(char* s,int idx){
		int u=0;
		for(int i=1;s[i];i++){
			if(!ch[u][s[i]-'a'])ch[u][s[i]-'a']=++tot;
			u=ch[u][s[i]-'a'];
		}
		pos[idx]=u;
	}
	void Build(){
		while(q.size())q.pop();
		rep(j,0,25)if(ch[0][j])q.push(ch[0][j]);
		while(q.size()){
			int u=q.front();q.pop();
			rep(j,0,25){
				if(ch[u][j])fail[ch[u][j]]=ch[fail[u]][j],q.push(ch[u][j]);
				else ch[u][j]=ch[fail[u]][j];
			}
		}
	}
	void Query(char* s){
		int u=0;
		for(int i=1;s[i];i++){
			u=ch[u][s[i]-'a'];
			w[u]++;
		}
	}
	void Solve(){
		while(q.size())q.pop();
		rep(i,1,tot)vis[fail[i]]=1;
		rep(i,1,tot)if(!vis[i])q.push(i);
		memset(vis,0,sizeof vis);
		while(q.size()){
			int u=q.front();q.pop();
			if(vis[u])continue;
			vis[u]=1;
			w[fail[u]]+=w[u];if(fail[u])q.push(fail[u]);
		}
		rep(i,1,n){
			printf("%d\n",w[pos[i]]);
		}
	}
}acm;
int main() {
	scanf("%d",&n);
	rep(i,1,n){
		scanf("%s",s+1);
		acm.Insert(s,i);
	}
	acm.Build();
	scanf("%s",t+1);
	acm.Query(t);
	acm.Solve();
	return 0;
}
2021/3/8 22:33
加载中...