#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define mk make_pair
#define pb push_back
inline ll read(){
ll x=0,f=1;char ch=getchar();
while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
return x*f;
}
char ss[100] = {' ','W','I','N','G'};
string name;
int W,I,N,G,f[305][305][100];
map<string,bool>www,iii,nnn,ggg;
string s;
int main(){
W = read(),I = read(), N = read(),G = read();
for(int i = 1; i <= W; i++){
cin >> s;
www[s] = 1;
}
for(int i = 1; i <= I; i++){
cin >> s;
iii[s] = 1;
}
for(int i = 1; i <= N; i++){
cin >> s;
nnn[s] = 1;
}
for(int i = 1; i <= G; i++){
cin >> s;
ggg[s] = 1;
}
cin >> name;
int flag;
for(int i = 0; i < name.size(); i++){
if(name[i] == 'W') flag = 1;
if(name[i] == 'I') flag = 2;
if(name[i] == 'N') flag = 3;
if(name[i] == 'G') flag = 4;
f[i+1][i+1][flag] = 1;
}
int lenn = name.size();
for(int len = 2; len <= lenn; len++){
for(int l = 1; l+len-1 <= lenn; l++){
int r = l+len-1;
for(int k = l; k < r; k++){
for(int x1 = 1; x1 <= 4; x1++){
for(int x2 = 1; x2 <= 4; x2++){
if((!f[l][k][x1]) || (!f[k+1][r][x2])) continue;
string s;
s.pb(ss[x1]);
s.pb(ss[x2]);
if(www[s]) f[l][r][1] = 1;
if(iii[s]) f[l][r][2] = 1;
if(nnn[s]) f[l][r][3] = 1;
if(ggg[s]) f[l][r][4] = 1;
}
}
}
}
}
flag = 0;
if(f[1][lenn][1]) flag = 1,cout << "W";
if(f[1][lenn][2]) flag = 1,cout << "I";
if(f[1][lenn][3]) flag = 1,cout << "N";
if(f[1][lenn][4]) flag = 1,cout << "G";
if(!flag) cout << "The name is wrong!";
return 0;
}
原题
怎么算都是O(L3)不知到为什么会TLE最后一个点
记录