有两份代码,差别仅仅在一个用数组一个用 unordered_map,但是数组 AC,unordered_map 会 TLE。
求原因。
#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;
}