但数组开 1e6 就过了,我感觉没越界啊?
#include<bits/stdc++.h>
using namespace std;
const int N=3e5+5;
int n,m,tot=1,a[N];
int id[N],ch[N][26],fail[N];
int dn,sz[N],fa[N],son[N],top[N],dfn[N],rev[N];
char s[N];
vector<int> G[N];
multiset<int> S[N];
struct SegTree{
int mx[N*4];
#define lc (k<<1)
#define rc (k<<1|1)
#define mid (l+r>>1)
void build(int k=1,int l=1,int r=dn)
{
mx[k]=-1;
if(l==r) {mx[k]=S[rev[l]].size()?*S[rev[l]].rbegin():-1;return;}
build(lc,l,mid),build(rc,mid+1,r);
mx[k]=max(mx[lc],mx[rc]);
}
void upd(int x,int k=1,int l=1,int r=dn)
{
if(l==r) {mx[k]=S[rev[l]].size()?*S[rev[l]].rbegin():-1;return;}
x<=mid?upd(x,lc,l,mid):upd(x,rc,mid+1,r);
mx[k]=max(mx[lc],mx[rc]);
}
int qmx(int x,int y,int k=1,int l=1,int r=dn)
{
if(l>=x&&r<=y) return mx[k];
int res=-1;
if(x<=mid) res=qmx(x,y,lc,l,mid);
if(mid<y) res=max(res,qmx(x,y,rc,mid+1,r));
return res;
}
}tr;
void build()
{
for(int i=0;i<26;i++) ch[0][i]=1;
queue<int> q;q.push(1);
while(!q.empty())
{
int u=q.front();q.pop();
G[fail[u]].push_back(u);
for(int i=0;i<26;i++)
if(!ch[u][i]) ch[u][i]=ch[fail[u]][i];
else fail[ch[u][i]]=ch[fail[u]][i],q.push(ch[u][i]);
}
}
void dfs1(int u)
{
sz[u]=1;son[u]=-1;
for(int v:G[u])
{
fa[v]=u;
dfs1(v);
sz[u]+=sz[v];
if(son[u]==-1||sz[v]>sz[son[u]]) son[u]=v;
}
}
void dfs2(int u,int topf)
{
dfn[u]=++dn,rev[dn]=u,top[u]=topf;
if(son[u]) dfs2(son[u],topf);
for(int v:G[u]) if(v!=son[u]) dfs2(v,v);
}
int Qmx(int x)
{
int mx=-1;
while(top[x]) mx=max(mx,tr.qmx(dfn[top[x]],dfn[x])),x=fa[top[x]];
return max(mx,tr.qmx(1,dfn[x]));
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>s;
int u=1,len=strlen(s);
for(int i=0;i<len;i++)
{
int c=s[i]-'a';
if(!ch[u][c]) ch[u][c]=++tot;
u=ch[u][c];
}
id[i]=u;S[u].insert(0);
}
build();
dfs1(0),dfs2(0,0);tr.build();
while(m--)
{
int op,i,x;cin>>op;
if(op==1)
{
cin>>i>>x;
S[id[i]].erase(S[id[i]].find(a[i]));
S[id[i]].insert(a[i]=x);
tr.upd(dfn[id[i]]);
}
else
{
cin>>s;
int u=1,len=strlen(s),mx=-1;
for(int i=0;i<len;i++)
{
int c=s[i]-'a';
u=ch[u][c];
mx=max(mx,Qmx(u));
}
cout<<mx<<'\n';
}
}
}