这里有份代码,交上去一直会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;
}