为什么用unordered_map会TLE?
查看原帖
为什么用unordered_map会TLE?
1123573
xyx404楼主2025/1/19 14:00

有两份代码,差别仅仅在一个用数组一个用 unordered_map,但是数组 AC,unordered_map 会 TLE。

求原因。

unordered_map 版

#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define itn int
#define ull unsigned long long 
int W,I,N,G;
unordered_map<char,unordered_map<char,unordered_map<char,bool> > >mp;
unordered_map<int,unordered_map<int,unordered_map<char,bool> > >dp;
string l;
char pg[]={"WING"};
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	cin>>W>>I>>N>>G;
	for(int i=1;i<=W;i++){
		cin>>l;
		mp['W'][l[0]][l[1]]=1;
	}
	for(int i=1;i<=I;i++){
		cin>>l;
		mp['I'][l[0]][l[1]]=1;
	}
	for(int i=1;i<=N;i++){
		cin>>l;
		mp['N'][l[0]][l[1]]=1;
	}
	for(int i=1;i<=G;i++){
		cin>>l;
		mp['G'][l[0]][l[1]]=1;
	}
	cin>>l;
	int len=l.size();
	l=" "+l+"          ";
	for(int i=1;i<=len;i++)dp[i][i][l[i]]=1;
	for(int i=1;i<len;i++){//每段长度 
		for(int st=1;st<=len-i;st++){// 起点 
			int ed=st+i;// 终点
			 for(int k=st;k<ed;k++){// 断点 
			 	for(int m=0;m<4;m++){// 变成 pg[m] 
			 		for(int n=0;n<4;n++){
			 			for(int o=0;o<4;o++){// 由 pg[n] 和 pg[o] 变
			 				if(mp[pg[m]][pg[n]][pg[o]]&&dp[st][k][pg[n]]&&dp[k+1][ed][pg[o]]){
			 					dp[st][ed][pg[m]]=1;
							 }
						 }
					 }
				 }
			 }
		}
	}
	bool flag=0;
	if(dp[1][len]['W'])flag=1,cout<<"W";
	if(dp[1][len]['I'])flag=1,cout<<"I";
	if(dp[1][len]['N'])flag=1,cout<<"N";
	if(dp[1][len]['G'])flag=1,cout<<"G";
	if(!flag)cout<<"The name is wrong!";
	return 0;
}

数组版:

#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define itn int
#define ull unsigned long long 
int W,I,N,G;
//unordered_map<char,unordered_map<char,unordered_map<char,bool> > >mp;
//unordered_map<int,unordered_map<int,unordered_map<char,bool> > >dp;
bool mp[201][201][201],dp[201][201][201];
string l;
//char pg[]={"WING"};
int ctoi(char x){
	if(x=='W')return 1;
	if(x=='I')return 2;
	if(x=='N')return 3;
	if(x=='G')return 4;
} 
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	cin>>W>>I>>N>>G;
	for(int i=1;i<=W;i++){
		cin>>l;
		mp[1][ctoi(l[0])][ctoi(l[1])]=1;
	}
	for(int i=1;i<=I;i++){
		cin>>l;
		mp[2][ctoi(l[0])][ctoi(l[1])]=1;
	}
	for(int i=1;i<=N;i++){
		cin>>l;
		mp[3][ctoi(l[0])][ctoi(l[1])]=1;
	}
	for(int i=1;i<=G;i++){
		cin>>l;
		mp[4][ctoi(l[0])][ctoi(l[1])]=1;
	}
	cin>>l;
	int len=l.size();
	l=" "+l+"          ";
	for(int i=1;i<=len;i++)dp[i][i][ctoi(l[i])]=1;
	for(int i=1;i<len;i++){//每段长度 
		for(int st=1;st<=len-i;st++){// 起点 
			int ed=st+i;// 终点
			 for(int k=st;k<ed;k++){// 断点 
			 	for(int m=1;m<=4;m++){// 
			 		for(int n=1;n<=4;n++){
			 			for(int o=1;o<=4;o++){// 
			 				if(mp[m][n][o]&&dp[st][k][n]&&dp[k+1][ed][o]){
			 					dp[st][ed][m]=1;
							 }
						 }
					 }
				 }
			 }
		}
	}
	bool flag=0;
	if(dp[1][len][1])flag=1,cout<<"W";
	if(dp[1][len][2])flag=1,cout<<"I";
	if(dp[1][len][3])flag=1,cout<<"N";
	if(dp[1][len][4])flag=1,cout<<"G";
	if(!flag)cout<<"The name is wrong!";
	return 0;
}
2025/1/19 14:00
加载中...