RE 20 分求助
查看原帖
RE 20 分求助
164580
YGB_XU楼主2023/1/14 21:21

代码如下,思路和第一篇题解一样,设置断点之后推测 RE 位于 insert 函数中,然而经过层层 assert 还是没找到原因,故求助

#include<bits/stdc++.h>
using namespace std;

const int NR=1e5+5,MR=2e6+5;
int n,q;
int _end[NR];
string s[NR];

struct Node{
	int ch[26],fail;
}t[MR];

int top=0;
inline void insert(string str,int id){
	int v,now=0;
	for(unsigned int i=0;i<str.length();i++){
		v=str[i]-'a';
		assert(0<=v&&v<=25);
		assert(0<=now&&now<MR);
		if(!t[now].ch[v]) t[now].ch[v]=++top;
		assert(0<=top&&top<MR);
		now=t[now].ch[v];
	}
	assert(0<=id&&id<NR);
	_end[id]=now;
}

vector<int>g[MR];
inline void build(){
	queue<int>q;
	for(int i=0;i<26;i++){
		if(t[0].ch[i]){
			q.push(t[0].ch[i]);
			t[t[0].ch[i]].fail=0;
		}
	}
	while(!q.empty()){
		int x=q.front();q.pop();
		g[t[x].fail].push_back(x);
		for(int i=0;i<26;i++){
			if(t[x].ch[i]){
				q.push(t[x].ch[i]);
				t[t[x].ch[i]].fail=t[t[x].fail].ch[i];
			}else{
				t[x].ch[i]=t[t[x].fail].ch[i];
			}
		}
	}
}

int tim=0;
int pos[MR][2],f[MR][21],dep[MR];
inline void dfs(int x){
	pos[x][0]=++tim;
	for(unsigned int i=0;i<g[x].size();i++){
		int y=g[x][i];
		f[y][0]=x;dep[y]=dep[x]+1;
		dfs(y);
	}
	pos[x][1]=tim;
}

int lca;
inline void findlca(int x,int y){
	if(dep[x]<dep[y]) swap(x,y);
	for(int k=20;k>=0;k--){
		if(dep[x]<=(1<<k)) continue;
		if(dep[f[x][k]]>=dep[y]) x=f[x][k];
	}
	if(x==y) return lca=x,void();
	for(int k=20;k>=0;k--){
		if(dep[x]<=(1<<k)) continue;
		if(f[x][k]!=f[y][k]){
			x=f[x][k];
			y=f[y][k];
		}
	}
	return lca=f[x][0],void();
}

int _t[MR];
inline int lowbit(int x){return x&(-x);}
inline void add(int x,int k){while(x<=top+1){_t[x]+=k;x+=lowbit(x);}}
inline int sum(int x){int ret=0;while(x){ret+=_t[x];x-=lowbit(x);}return ret;}

inline bool cmp(int x,int y){
	return pos[x][0]<pos[y][0];
}

int main(){
	// ios::sync_with_stdio(false);
	
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>s[i];
		insert(s[i],i);
	}
	return 0;
	build();
	dep[0]=1;
	dfs(0);
	
	for(int k=1;k<=20;k++){
		for(int i=1;i<=top;i++){
			if(dep[i]<=(1<<k)) continue;
			f[i][k]=f[f[i][k-1]][k-1];
		}
	}
	
	int opt;string tmp;
	vector<int>adj;
	cin>>q;
	while(q--){
		cin>>opt;
		if(opt==1){
			cin>>tmp;
			adj.clear();
			int now=0,v;
			for(unsigned int i=0;i<tmp.length();i++){
				v=tmp[i]-'a';
				now=t[now].ch[v];
				adj.push_back(now);
			}
			sort(adj.begin(),adj.end(),cmp);
			add(pos[adj[0]][0],+1);
			for(unsigned int i=1;i<adj.size();i++){
				findlca(adj[i],adj[i-1]);
				add(pos[adj[i]][0],+1);
				add(pos[lca][0],-1);
			}
		}else{
			cin>>opt;
			assert(1<=opt&&opt<=n);
			cout<<sum(pos[_end[opt]][1])-sum(pos[_end[opt]][0]-1)<<'\n';
		}
	}
	
	return 0;
}
2023/1/14 21:21
加载中...