听灌多(玄关)
  • 板块灌水区
  • 楼主rpyluogu
  • 当前回复18
  • 已保存回复20
  • 发布时间2024/8/2 11:20
  • 上次更新2024/8/2 12:23:34
查看原帖
听灌多(玄关)
1049376
rpyluogu楼主2024/8/2 11:20

请问关流时 "\n""\n" 比 ‘\n’‘\n’ 快一些,在这道题中时间卡得比较极限,将 "\n""\n" 换成 ‘\n’‘\n’ 就从 ACAC 变成TLETLE

AC:

// LUOGU_RID: 169829351
#include<bits/stdc++.h>
using namespace std;
int n,t,f[205][6005],res;
string s;
struct node{
	int fir,sec;
}pos[60][2005];
vector<int>v[205][205];
void ans(node p){
	if(p.sec==-1){
		return ;
	}
	ans(pos[p.sec][p.fir]);
	if(p.sec>25){
		cout<<char(p.sec-26+'A');
	}
	else{
		cout<<char(p.sec+'a');
	}
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>t;
	for(register int o=1;o<=t;o++){
		cin>>n;
		for(register int i=1;i<=n;i++){
			cin>>s;
			for(register int j=0;j<52;j++){
				v[i][j].clear();
			}
			for(register int j=0;j<s.size();j++){
				if(s[j]>='A'&&s[j]<='Z'){
					v[i][s[j]-'A'+26].push_back(j+1);
				}
				if(s[j]>='a'&&s[j]<='z'){
					v[i][s[j]-'a'].push_back(j+1);
				}
			}
		}
		int res=0;
		memset(f,0,sizeof f);
		queue<node>q;
		for(register int i=0;i<52;i++){
			for(register int j=0;j<(1<<n);j++){
				q.push({j,i});
				 pos[i][j].fir=-1;
				 pos[i][j].sec=-1;
			}
		}
		int x=-1,y=-1;
		while(!q.empty()){
			int a=q.front().fir,b=q.front().sec;
			q.pop();
			int flag=1;
			for(register int i=1;i<=n;i++){
				if(((a>>(i-1))&1)>=v[i][b].size()){			
					flag=0;
				}
			}
			if(!flag){
				continue;
			}
			f[b][a]=max(f[b][a],1);
			if(f[b][a]>res){
				res=f[b][a];
				x=a;
				y=b;
			}
			for(register int i=0;i<52;i++){
				int check=1,to=0;
				for(register int j=1;j<=n;j++){
					int tot=((a>>(j-1))&1);
					tot=v[j][b][tot];
					int k=0;
					while(k<v[j][i].size()&&v[j][i][k]<=tot){
						k++;
					}
				 		if(k>=v[j][i].size()){
				 			check=0;
				 			break;
				 		}
						if(k==1){
							to=to|(1<<(j-1));
						}
					}
					if(!check){
						continue;
					}
					if(f[i][to]<f[b][a]+1){
						f[i][to]=f[b][a]+1;
						pos[i][to]={a,b};
						q.push({to,i});
					}
				}
			}
		cout<<res<<"\n";
		ans({x,y});
		cout<<"\n";
	}
	return 0;
}

TLE:

// LUOGU_RID: 169829351
#include<bits/stdc++.h>
using namespace std;
int n,t,f[205][6005],res;
string s;
struct node{
	int fir,sec;
}pos[60][2005];
vector<int>v[205][205];
void ans(node p){
	if(p.sec==-1){
		return ;
	}
	ans(pos[p.sec][p.fir]);
	if(p.sec>25){
		cout<<char(p.sec-26+'A');
	}
	else{
		cout<<char(p.sec+'a');
	}
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>t;
	for(register int o=1;o<=t;o++){
		cin>>n;
		for(register int i=1;i<=n;i++){
			cin>>s;
			for(register int j=0;j<52;j++){
				v[i][j].clear();
			}
			for(register int j=0;j<s.size();j++){
				if(s[j]>='A'&&s[j]<='Z'){
					v[i][s[j]-'A'+26].push_back(j+1);
				}
				if(s[j]>='a'&&s[j]<='z'){
					v[i][s[j]-'a'].push_back(j+1);
				}
			}
		}
		int res=0;
		memset(f,0,sizeof f);
		queue<node>q;
		for(register int i=0;i<52;i++){
			for(register int j=0;j<(1<<n);j++){
				q.push({j,i});
				 pos[i][j].fir=-1;
				 pos[i][j].sec=-1;
			}
		}
		int x=-1,y=-1;
		while(!q.empty()){
			int a=q.front().fir,b=q.front().sec;
			q.pop();
			int flag=1;
			for(register int i=1;i<=n;i++){
				if(((a>>(i-1))&1)>=v[i][b].size()){			
					flag=0;
				}
			}
			if(!flag){
				continue;
			}
			f[b][a]=max(f[b][a],1);
			if(f[b][a]>res){
				res=f[b][a];
				x=a;
				y=b;
			}
			for(register int i=0;i<52;i++){
				int check=1,to=0;
				for(register int j=1;j<=n;j++){
					int tot=((a>>(j-1))&1);
					tot=v[j][b][tot];
					int k=0;
					while(k<v[j][i].size()&&v[j][i][k]<=tot){
						k++;
					}
				 		if(k>=v[j][i].size()){
				 			check=0;
				 			break;
				 		}
						if(k==1){
							to=to|(1<<(j-1));
						}
					}
					if(!check){
						continue;
					}
					if(f[i][to]<f[b][a]+1){
						f[i][to]=f[b][a]+1;
						pos[i][to]={a,b};
						q.push({to,i});
					}
				}
			}
		cout<<res<<'\n';
		ans({x,y});
		cout<<'\n';
	}
	return 0;
}

TLE状态:

2024/8/2 11:20
加载中...