用了map<pair<char, char>, set<char>>就T了
用
#define ll long long
ll chash(char c1, char c2) {
return (c1-'A')*26+(c2-'A');
}
map<ll, set<char>>
就过了
下面还有一个讨论说卡常谨慎使用set map之类 但是我还是想用喵
关键部分以供参考:
map<ll, set<char>> mp;
ll chash(char c1, char c2) {
return (c1 - 'A') * 26 + (c2 - 'A');
}
set<char> merge(set<char> s1, set<char> s2) {
set<char> res;
for(auto x: s1) {
for(auto y: s2) {
if(mp.count(chash(x, y))) {
for(auto z: mp[chash(x, y)]) {
res.insert(z);
}
}
}
}
return res;
}
void solve(){
ll wi, ii, ni, gi;
cin >> wi >> ii >> ni >> gi;
for(ll i = 1; i <= wi; i++) {
string s;
cin >> s;
mp[chash(s[0], s[1])].insert('W');
}
for(ll i = 1; i <= ii; i++) {
string s;
cin >> s;
mp[chash(s[0], s[1])].insert('I');
}
for(ll i = 1; i <= ni; i++) {
string s;
cin >> s;
mp[chash(s[0], s[1])].insert('N');
}
for(ll i = 1; i <= gi; i++) {
string s;
cin >> s;
mp[chash(s[0], s[1])].insert('G');
}
string s;
cin >> s;
ll len = s.length();
s = ' ' + s;
vector<vector<set<char>>> dp(len+1, vector<set<char>>(len+1, set<char>()));
for(ll i = 1; i <= len; i++) {
dp[i][i].insert(s[i]);
}
for(ll siz = 2; siz <= len; siz++) {
for(ll i = 1; i + siz - 1 <= len; i++) {
ll l = i, r = i + siz - 1;
for(ll k = l; k < r; k++) {
auto res = merge(dp[l][k], dp[k+1][r]);
for(auto x: res) {
dp[l][r].insert(x);
}
}
}
}
if(dp[1][len].size() == 0) {
cout << "The name is wrong!\n";
return;
}
if(dp[1][len].contains('W')) {
cout << "W";
}
if(dp[1][len].contains('I')) {
cout << "I";
}
if(dp[1][len].contains('N')) {
cout << "N";
}
if(dp[1][len].contains('G')) {
cout << "G";
}
cout << "\n";
}