如题,sub 4 TLE on # 3,8,9,10,12
如果有其他问题也请指出
#include<bits/stdc++.h>
#define query(x) (max(a[x],tag[bp[x]]))
using namespace std;
const int maxn = 1e5+5;
const int warma = 707;
string s[maxn];
int Len[maxn];
struct Query{
Query(int L,int R,int ID){
l=L,r=R,id=ID;
}
int l,r,id;
};
int n,q;
vector<Query> Q[maxn];
int answer[maxn];
vector<int> Vtree;//虚树
int L[maxn*5],R[maxn*5],Node[maxn*5];
int bp[maxn*5];
int son[maxn*5][26],fail[maxn*5],rt,tot,dfncnt;
int sz[maxn*5],Hson[maxn*5],top[maxn*5],dep[maxn*5];
vector< pair<int,int> > w[maxn];
vector<int> edge[maxn*5];
vector<int> fa[maxn];
vector<int> road[maxn*5];//虚树上的节点
inline void insert(int pos){
int len=s[pos].size(),now=rt;
for(int i=0;i<len;++i){
if(son[now][s[pos][i]-'a']==0) son[now][s[pos][i]-'a']=++tot;
now=son[now][s[pos][i]-'a'];
fa[pos].push_back(now);
}
}
inline void build(){
queue<int> q;
for(int i=0;i<26;++i) if(son[rt][i]) fail[son[rt][i]]=rt,q.push(son[rt][i]);
while(q.size()>0){
int u=q.front();
q.pop();
for(int i=0;i<26;++i){
if(son[u][i]){
fail[son[u][i]]=son[fail[u]][i];
q.push(son[u][i]);
}
else son[u][i]=son[fail[u]][i];
}
}
for(int i=1;i<=tot;++i){
edge[fail[i]].push_back(i);
}
}
inline void dfs(int u,bool f){
if(f==true) L[u]=++dfncnt,Node[dfncnt]=u,sz[u]=1;
for(int i=0;i<edge[u].size();i++){
int v=edge[u][i];
if(f==true) dep[v]=dep[u]+1;
dfs(v,f);
sz[u]+=sz[v];
if(f==true){
sz[u]+=sz[v];
if(Hson[u]==-1||sz[v]>sz[Hson[u]]) Hson[u]=v;
}
}
if(f==true) R[u]=dfncnt;
}
inline void HLD(int u,int tp){
top[u]=tp;
for(int i=0;i<edge[u].size();i++){
int v=edge[u][i];
if(v!=Hson[u]) HLD(v,v);
}
if(Hson[u]!=-1) HLD(Hson[u],tp);
}
inline int LCA(int u,int v){
while(top[u]!=top[v]){
if(dep[top[u]]<dep[top[v]]) swap(u,v);
u=fail[top[u]];
}
if(dep[u]<dep[v]) swap(u,v);
return v;
}
int tag[maxn],a[maxn*5];
inline void cover(int l,int r,int v){
int bl=bp[l],br=bp[r];
if(bl==br){
for(int i=l;i<=r;++i) a[i]=v;
return ;
}
for(int i=bl+1;i<br;++i) tag[i]=v;
for(int i=l;i<=bl*warma;++i) a[i]=v;
for(int i=(br-1)*warma+1;i<=r;++i) a[i]=v;
}
struct ASK{
int l,k,id;
ASK(int L,int K,int ID){
l=L,k=K,id=ID;
}
};
int tr[maxn<<2];
inline void build(int cur,int lt,int rt){
if(lt==rt){
tr[cur]=sz[fa[lt].back()];
return ;
}
int mid=(lt+rt)>>1;
build(cur<<1,lt,mid);
build(cur<<1|1,mid+1,rt);
tr[cur]=max(tr[cur<<1],tr[cur<<1|1]);
}
inline int query_mx(int cur,int l,int r,int lt,int rt){
if(l<=lt&&rt<=r) return tr[cur];
if(r<lt||l>rt) return 0;
int mid=(lt+rt)>>1;
return max(query_mx(cur<<1,l,r,lt,mid),query_mx(cur<<1|1,l,r,mid+1,rt));
}
inline bool cmp(int A,int B){
return L[A]<L[B];
}
vector<ASK> ask[maxn];
inline void V_build(int u){
for(int i=0;i<road[u].size();++i){
int v=road[u][i];
V_build(v);
sz[u]+=sz[v];
}
}
inline bool cmp1(pair<int,int> A,pair<int,int> B){
return A.second>B.second;
}
int flag[maxn];
int Lsz;
int B;
set<int> S;
int root;
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
memset(Hson,-1,sizeof(Hson));
cin>>n>>q;
for(int i=1;i<=n;++i) cin>>s[i],Len[i]=s[i].size(),Lsz+=Len[i];
B=sqrt(Lsz)*1.3;
for(int i=1;i<=q;++i){
int l,r,k;
cin>>l>>r>>k;
if(Len[k]<=B){
flag[k]=1;
ask[r].push_back(ASK(l,k,i));
}
else{
Q[k].push_back(Query(l,r,i));
}
}
for(int i=1;i<=n;++i) insert(i);
build();
dfs(rt,true);
HLD(rt,rt);
for(int i=1;i<=dfncnt;i++) bp[i]=(i-1)/warma+1;
for(int i=0;i<=tot;i++) sz[i]=0;
for(int i=1;i<=n;++i){
if(flag[i]==0) continue;
S.clear();
Vtree.clear();
root=-1;
for(int j=0;j<fa[i].size();++j) Vtree.push_back(fa[i][j]),S.insert(fa[i][j]),sz[fa[i][j]]++;
sort(Vtree.begin(),Vtree.end(),cmp);
for(int j=0;j<Vtree.size()-1;++j){
int u=LCA(Vtree[j],Vtree[j+1]);
S.insert(u);
}
Vtree.clear();
for(set<int>::iterator i=S.begin();i!=S.end();++i){
int x=(*i);
Vtree.push_back(x);
if(root==-1||dep[x]<dep[root]) root=x;
}
sort(Vtree.begin(),Vtree.end(),cmp);
for(int j=0;j<Vtree.size()-1;++j){
int u=LCA(Vtree[j],Vtree[j+1]);
road[u].push_back(Vtree[j+1]);
}
V_build(root);
for(int j=0;j<Vtree.size();++j) w[i].push_back(make_pair(Vtree[j],sz[Vtree[j]]));
sort(w[i].begin(),w[i].end(),cmp1);
for(int j=0;j<Vtree.size();++j){
sz[Vtree[j]]=0;
road[Vtree[j]].clear();
}
}
for(int i=1;i<=n;++i){
cover(L[fa[i].back()],R[fa[i].back()],i);
for(int j=0;j<ask[i].size();++j){
ASK now=ask[i][j];
for(int k=0;k<w[now.k].size();++k){
pair<int,int> u=w[now.k][k];
if(query(L[u.first])>=now.l){
answer[now.id]=max(answer[now.id],u.second);
break;
}
}
}
}
for(int i=1;i<=n;++i){
if(Q[i].size()>0){
for(int i=0;i<=tot;i++) sz[i]=0;
for(int j=0;j<fa[i].size();++j){
int u=fa[i][j];
++sz[u];
}
dfs(rt,false);
build(1,1,n);
for(int j=0;j<Q[i].size();++j){
Query now=Q[i][j];
answer[now.id]=query_mx(1,now.l,now.r,1,n);
}
}
}
for(int i=1;i<=q;++i) cout<<answer[i]<<'\n';
return 0;
}
/*
6 1
a
aaa
dedicatus
misaka
mikoto
mi
1 2 2
*/