#67TLE!虽然不是萌新,但是仍需大佬帮助QAQ
查看原帖
#67TLE!虽然不是萌新,但是仍需大佬帮助QAQ
422328
yywlp楼主2024/7/29 19:39

RT

与std对拍大数据感觉速度差不太多,莫名奇妙的TLE

Code

#include<bits/stdc++.h>
using namespace std;
#define f(x) (x<=n?x+n:x-n)
#define il inline
const int M=5e6+10;
int tt;
struct NODE{
	string c;
	int len,pos,id;
}s[M];
int pos[M];
il bool cmp(const NODE &A,const NODE&B){
	if(A.pos||B.pos)return !(bool)A.pos;
	return A.len>B.len;
}
struct EDGE{
	int to,next;
}e[M<<1];
int head[M],ct=0;
il void add(int u,int v){
	ct++;
	e[ct]=EDGE{v,head[u]};
	head[u]=ct;
}
int n;
int cnt;
int r1,r2;
int c[M][2],ch[M][2],fa[M],tot;
bool bo[M];
vector<int>b[M],sq[M],sh[M];
il void insert(string &s){
//	cout<<"insert:"<<s<<endl;
	int len=s.size(),u=0;
	for(int i=0;i<len;i++){
		int c=s[i]-'0';
		if(!ch[u][c])ch[u][c]=++tot;
		u=ch[u][c];
	}
	bo[u]=1;
}
il bool check(string &s){
	int len=s.size(),u=0;
	for(int i=0;i<len;i++){
		int c=s[i]-'0';
		if(bo[u])return false;
		if(!ch[u][c])return true;
		u=ch[u][c];
	}
	return false;
}
il void insert(string &s,int p,int id){
	int u=(p==0?r1:r2),len=s.size();
	for(int i=0;i<len;i++){
		int nc=s[i]-'0';
		if(!c[u][nc]){
			c[u][nc]=++cnt;
			fa[cnt]=u;
			if(p==0)add(u,cnt);
			else add(cnt,u);
		}
		u=c[u][nc];
	}
	add(u,id);
	b[u].push_back(id);
}
il void add(string &s,int id){
	int u1=r1,u2=r2;
	int len=s.size();
	for(int i=0;i<len;i++){
		int nc=s[i]-'0';
		u1=c[u1][nc];
		u2=c[u2][nc];
	}
	if(c[u1][0])add(id,c[u1][0]);
	if(c[u1][1])add(id,c[u1][1]);
	if(fa[u2])add(id,fa[u2]);
	len=b[u1].size();
	for(int i=0;i<len;i++){
		if(f(b[u1][i])==id){
			if(i>0)add(id,sq[u1][i-1]);
			if(i<len-1)add(id,sh[u1][i+1]);
			break;
		}
	}
}
int dfn[M],low[M],col[M],tim,snt;
int st[M],top;
il void tarjan(int u){
	dfn[u]=low[u]=++tim;
	st[++top]=u;
	for(int i=head[u];i;i=e[i].next){
		int v=e[i].to;
		if(!dfn[v]){
			tarjan(v);
			low[u]=min(low[u],low[v]);
		}else if(!col[v])low[u]=min(low[u],dfn[v]);
	}
	if(low[u]==dfn[u]){
		snt++;
		while(st[top+1]!=u)col[st[top--]]=snt;
	}
}
char cs[M];
string ans[M];
signed main(){
//	freopen("temp.in","r",stdin);
//	freopen("temp.out","w",stdout);
//	ios::sync_with_stdio(0);
//	cin.tie(0);
//	cout.tie(0);
	cin>>n;
	cnt=2*n;
	r1=++cnt,r2=++cnt;
	for(int i=1;i<=n;i++){
		scanf("%s",(cs+1));
		int len=strlen(cs+1);
		for(int j=1;j<=len;j++)s[i].c+=cs[j];
		s[i].len=len;
		for(int j=0;j<s[i].len;j++){
			if(s[i].c[j]=='?'){
				s[i].pos=j+1;
				break;
			}
		}
		s[i].id=i;
	}
	sort(s+1,s+n+1,cmp);
	for(int i=1;i<=n;i++){
		if(s[i].pos){
			s[i].c[s[i].pos-1]='0';
			bool p1=check(s[i].c);
			s[i].c[s[i].pos-1]='1';
			bool p2=check(s[i].c);
			if(p1&&p2)pos[++tt]=i;
			else if(p1)s[i].c[s[i].pos-1]='0',insert(s[i].c),ans[s[i].id]=s[i].c;
			else if(p2)s[i].c[s[i].pos-1]='1',insert(s[i].c),ans[s[i].id]=s[i].c;
			else{
				puts("NO");
				return 0;
			}
		}else{
			ans[s[i].id]=s[i].c;
			if(check(s[i].c))insert(s[i].c);
			else{
				puts("NO");
				return 0;
			}
		}
	}
//	cout<<"tt:"<<tt<<endl;
	for(int i=1;i<=tt;i++){
		int np=pos[i];
		s[np].c[s[np].pos-1]='0';
		insert(s[np].c,0,i+n);
		insert(s[np].c,1,i+n);
		s[np].c[s[np].pos-1]='1';
		insert(s[np].c,0,i);
		insert(s[np].c,1,i);
	}
	for(int i=1;i<=cnt;i++){
		if(!b[i].empty()){
			int len=b[i].size()-1;
			sq[i].resize(len+1),sh[i].resize(len+1);
			add(sq[i][0]=++cnt,b[i][0]);
			for(int k=1;k<=len;k++){
				int ns=sq[i][k]=++cnt;
				add(ns,sq[i][k-1]),add(ns,b[i][k]);
			}
			add(sh[i][len]=++cnt,b[i][len]);
			for(int k=len-1;k>=0;k--){
				int ns=sh[i][k]=++cnt;
				add(ns,sh[i][k+1]),add(ns,b[i][k]);
			}
		}
	}
	for(int i=1;i<=tt;i++){
		int np=pos[i];
		s[np].c[s[np].pos-1]='0';
		add(s[np].c,i);
		s[np].c[s[np].pos-1]='1';
		add(s[np].c,i+n);
	}
	for(int i=1;i<=2*n;i++){
		top=0;
		if(!dfn[i])tarjan(i);
	}
	for(int i=1;i<=tt;i++){
		int np=pos[i];
		ans[s[np].id]=s[np].c;
		if(col[i]<col[i+n])ans[s[np].id][s[np].pos-1]='0';
		else if(col[i]>col[i+n])ans[s[np].id][s[np].pos-1]='1';
		else{
			puts("NO");
			return 0;
		}
	}
	puts("YES");
	for(int i=1;i<=n;i++)cout<<ans[i]<<endl;
	return 0;
}
2024/7/29 19:39
加载中...