求助
查看原帖
求助
593595
_Aurore_楼主2023/1/12 16:46

这里有份代码,交上去一直会UKE,不知道是什么问题。 自己造了几份数据和题解对拍也没有出现问题

#include<bits/stdc++.h>
#define int long long
#define MAXN 1000005
using namespace std;
inline int read(){
	int x=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-')
			f=-f;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		x=x*10+ch-'0';
		ch=getchar();
	} 
	return x*f;
} 
int T,n,back[MAXN];
string s;
bool vis[MAXN];
int trie[MAXN][26],cnt;
int a[MAXN],dfn[MAXN],siz[MAXN];
struct node{
	int num,fail;
}t[MAXN];
int insert(string s){
	int len=s.length(),rot=0;
	for(int i=0;i<len;i++){
		int c=s[i]-'a';
		if(!trie[rot][c])
			trie[rot][c]=++cnt;
		rot=trie[rot][c];
	}
	t[rot].num++;
	return rot;
} 
queue<int> q;
void Fail(){
	for(int i=0;i<26;i++)
		if(trie[0][i])
			q.push(trie[0][i]);
	while(!q.empty()){
		int u=q.front();
		q.pop();
		for(int i=0;i<26;i++){
			int v=trie[u][i];
			if(v){
				t[v].fail=trie[t[u].fail][i];
				q.push(v);
			}
			else
				trie[u][i]=trie[t[u].fail][i];
		}
	}
}
int tot;
vector<int> e[MAXN];
void dfs(int x,int dad,int sum){
	dfn[x]=++tot;
	siz[x]=1;
	a[tot]=sum+t[x].num;
	for(int i=0;i<e[x].size();i++){
		int to=e[x][i];
		if(to!=dad){
			dfs(to,x,sum+t[x].num);
			siz[x]+=siz[to];
		}
	}
}
struct Seg{
	int sum,tag;
}seg[MAXN];
void build(int i,int l,int r){
	if(l==r){
		seg[i].sum=a[l];
		return ;
	}
	int mid=(l+r)/2;
	build(i*2,l,mid);
	build(i*2+1,mid+1,r);
	seg[i].sum=seg[i*2].sum+seg[i*2+1].sum;
}
void pushdown(int i,int l,int r){
	int mid=(l+r)/2;
	seg[i*2].tag+=seg[i].tag;
	seg[i*2+1].tag+=seg[i].tag;
	seg[i*2].sum+=(mid-l+1)*seg[i].tag;
	seg[i*2+1].sum+=(r-mid)*seg[i].tag;
	seg[i].tag=0;
}
int query(int i,int l,int r,int id){
	if(l==r)
		return seg[i].sum;
	if(seg[i].tag)
		pushdown(i,l,r);
	int mid=(l+r)/2;
	if(mid>=id)
		return query(i*2,l,mid,id);
	else
		return query(i*2+1,mid+1,r,id);
	seg[i].sum=seg[i*2].sum+seg[i*2+1].sum;
}
void update(int i,int l,int r,int L,int R,int k){
	if(L<=l&&r<=R){
		seg[i].tag+=k;
		seg[i].sum+=k*(r-l+1);
		return ;
	}
	if(l>R||r<L)
		return ;
	if(seg[i].tag)
		pushdown(i,l,r);
	int mid=(l+r)/2;
	if(mid>=L)
		update(i*2,l,mid,L,R,k);
	if(mid<R)
		update(i*2+1,mid+1,r,L,R,k);
	seg[i].sum=seg[i*2].sum+seg[i*2+1].sum; 
}
signed main(){
	T=read(),n=read();
	for(int i=1;i<=n;i++){
		cin>>s;
		back[i]=insert(s);
	}
	Fail();
	for(int i=1;i<=cnt;i++){
		int u=i,v=t[i].fail;
		e[u].push_back(v);
		e[v].push_back(u);
	}
	dfs(0,-1,0);
	build(1,1,tot);
	while(T--){
		char opt;
		cin>>opt;
		if(opt=='?'){
			cin>>s;
			int len=s.length(),rot=0,res=0;
			for(int i=0;i<len;i++){
				int c=s[i]-'a';
				rot=trie[rot][c];
				res+=query(1,1,tot,dfn[rot]);
			}
			cout<<res<<endl;
		}
		else if(opt=='-'){
			int x=read();
			if(vis[x])
				continue;
			vis[x]=1;
			x=back[x];
			update(1,1,tot,dfn[x],dfn[x]+siz[x]-1,-1);
		}
		else{
			int x=read(); 
			if(!vis[x])
				continue;
			vis[x]=0;
			x=back[x];
			update(1,1,tot,dfn[x],dfn[x]+siz[x]-1,1);
		}
	} 
	return 0;
}
2023/1/12 16:46
加载中...