受不了了问一下大家TLEon3怎么解决啊啊啊
查看原帖
受不了了问一下大家TLEon3怎么解决啊啊啊
53769
北文楼主2024/1/18 16:35
#include<bits/stdc++.h>
using namespace std;
const int N=3e5+5;
vector<int> e[N], vt[N];
namespace ACAM{
	int t[N][26], fail[N], ed[N], tot;
	void insert(char *s) {
		int len=strlen(s), u=0;
		for(int i=0; i<len; i++) {
			int v=s[i]-'a';
			if(!t[u][v]) t[u][v]=++tot;
			u=t[u][v];
		}
		ed[u]++;
	}
	void build() {
		queue<int> q;
		for(int i=0; i<26; i++)
			if(t[0][i]) q.push(t[0][i]);
		while(!q.empty()) {
			int u=q.front(); q.pop();
			for(int i=0; i<26; i++) {
				if(t[u][i]) fail[t[u][i]]=t[fail[u]][i], q.push(t[u][i]);
				else t[u][i]=t[fail[u]][i];
			}
		}
		for(int i=1; i<=tot; i++) e[fail[i]].push_back(i);
	}
	void getpos(vector<int> &a, char *s) {
		int len=strlen(s), u=0;
		for(int i=0; i<len; i++) {
			int v=s[i]-'a';
			u=t[u][v];
			a.push_back(u);
		}
	}
}
//BZ lca
int fa[N][20], dep[N], dfn[N], dis[N], cnt;
void dfs(int u) {
	dfn[u]=++cnt;
	for(int i=1; i<=19; i++)
		fa[u][i]=fa[fa[u][i-1]][i-1];
	for(int v:e[u]) {
		fa[v][0]=u; 
		dep[v]=dep[u]+1; 
		dis[v]=dis[u]+ACAM::ed[v];
		dfs(v);
	}	
}
int lca(int x, int y) {
	if(dep[x]<dep[y]) swap(x, y);
	for(int i=19; ~i; i--)
		if(dep[fa[x][i]]>=dep[y]) x=fa[x][i];
	if(x==y) return x;
	for(int i=19; ~i; i--)
		if(fa[x][i]!=fa[y][i]) x=fa[x][i], y=fa[y][i];
	return fa[x][0];
}
bool tag1[N], tag2[N];
int D[N];
bool cmp(int a, int b) {
	return dfn[a]<dfn[b];
}
void buildvt(const vector<int> &a, const vector<int> &b) {
	vector<int> c=a;
	for(auto v:b) c.push_back(v);
	c.push_back(0);
	sort(c.begin(), c.end(), cmp);
	for(int i=0, len=c.size(); i<len-1; i++)
		c.push_back(lca(c[i], c[i+1]));
	sort(c.begin(), c.end(), cmp);
	c.erase(unique(c.begin(), c.end()), c.end());
	for(int i=0, len=c.size(); i<len-1; i++) {
		int f=lca(c[i], c[i+1]), s=c[i+1];
		vt[f].push_back(s);
		D[s]=dis[s]-dis[f];
	}
	for(auto v:c) tag1[v]=tag2[v]=0;
	for(auto v:a) tag1[v]=1;
	for(auto v:b) tag2[v]=1;
}
int ret;
void dfsv(int u) {
	for(int v:vt[u]) {
		dfsv(v);
		tag1[u]|=tag1[v]; tag2[u]|=tag2[v];
	}
	if(tag1[u]&&tag2[u]) ret+=D[u];
	vt[u].clear();
}
void dfsc(int u) {
	for(int v:vt[u]) {
		dfsc(v);
	}
	ret+=D[u];
	vt[u].clear();
}
int n, m, q, ans[N], id[N], rev[N];
char s[N], t[N];
vector<int> post[N];
vector<pair<int, int> > qry[N];
bool tag[N]; 
int W[N];
void predfs(int u) {
	for(int v:e[u]) {
		predfs(v);
		tag[u]|=tag[v];
	}
	if(tag[u]) W[u]=ACAM::ed[u];
	else W[u]=0;
}
void predfs2(int u) {
	for(int v:e[u]) {
		dis[v]=dis[u]+W[v];
		predfs2(v);
	}
}
vector<int> em;
int main() {
	double ti=clock();
	ios::sync_with_stdio(false);
	cin.tie(0);
	cin>>n>>m>>q;
	for(int i=1; i<=n; i++)
		cin>>s, ACAM::insert(s);
	ACAM::build();
	for(int i=1; i<=m; i++) {
		cin>>t; id[i]=i;
		ACAM::getpos(post[i], t);
	}
	sort(id+1, id+1+m, [&](int a, int b) {
		return post[a].size()>post[b].size(); 
	});
	for(int i=1; i<=m; i++) rev[id[i]]=i;
	dfs(0);
	int B=333; 
	for(int i=1, x, y; i<=q; ++i) {
		cin>>x>>y;
		if(post[x].size()<post[y].size()) swap(x, y);
		if(post[x].size()<=B) {
			buildvt(post[x], post[y]);
			ret=0; dfsv(0); ans[i]=ret;
		} else {
			qry[rev[x]].push_back({y, i});
		}
	}
//	if(double(clock()-ti)/CLOCKS_PER_SEC>1) {
//		return 0;
//	}
	for(int i=1; i<=m; ++i) {
		assert(i<=300);
		if(post[id[i]].size()<=B) break ;
		if(!qry[i].size()) continue ;
		
		for(int j=0; j<=ACAM::tot; ++j) tag[j]=0;
		
		for(int v:post[id[i]]) tag[v]=1;
		
		predfs(0); predfs2(0); 
		int l=-1; sort(qry[i].begin(), qry[i].end());
		
		for(int j=1; j<=m; ++j) {
			if(l+1>=qry[i].size()||qry[i][l+1].first!=j) continue ;
			buildvt(post[j], em);
			ret=0; dfsc(0); 
			while(l+1<qry[i].size()&&qry[i][l+1].first==j)
				l++, ans[qry[i][l].second]=ret;
		}
	}
	for(int i=1; i<=q; ++i)
		printf("%d\n", ans[i]);
	return 0;
}
2024/1/18 16:35
加载中...