代码如下,思路和第一篇题解一样,设置断点之后推测 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;
}