最后caseTLE
查看原帖
最后caseTLE
1135396
Coosis楼主2024/12/1 21:53

用了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";
}

2024/12/1 21:53
加载中...