TLE 求卡常
查看原帖
TLE 求卡常
520748
_Ch1F4N_楼主2023/8/31 21:22

如题,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
*/
2023/8/31 21:22
加载中...