三个点本应有解,但却输出无解
#include<bits/stdc++.h>
#define int long long
using namespace std;
int tot[5], n;
bool f[301][301][5];
short s[5][25][3], S[301];
int change(char c) {
if (c=='W') return 1;
else if (c=='I') return 2;
else if (c=='N') return 3;
else return 4;
}
void read(int n) {
string tmp;
for (int i=1; i<=tot[n]; ++i) {
cin >> tmp;
s[n][i][1]=change(tmp[0]);
s[n][i][2]=change(tmp[1]);
}
}
signed main() {
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
cin >> tot[1] >> tot[2] >> tot[3] >> tot[4];
read(1), read(2), read(3), read(4);
string tmp; cin >> tmp; n=tmp.size();
for (int i=1; i<=n; ++i) S[i]=change(tmp[i-1]);
for (int len=2; len<=n; ++len)
for (int l=1; l+len-1<=n; ++l) {
int r=l+len-1;
for (int k=1; k<=4; ++k)
for (int m=l; m<r; ++m)
for (int i=1; i<=tot[k]; ++i) {
if (f[l][m][s[k][i][1]] && f[m+1][r][s[k][i][2]])
f[l][r][k]=1;
if (len==2 && S[l]==s[k][i][1] && S[r]==s[k][i][2])
f[l][r][k]=1;
}
}
bool cnt=0;
if (f[1][n][1]) cout << 'W', cnt=1;
if (f[1][n][2]) cout << 'I', cnt=1;
if (f[1][n][3]) cout << 'N', cnt=1;
if (f[1][n][4]) cout << 'G', cnt=1;
if (!cnt) cout << "The name is wrong!";
cout << '\n';
return 0;
}