B - racecar
全探索
#include <bits/stdc++.h> using namespace std; #define REP(i,n) for(int i=0;i<n;i++) #define endl '\n' int main() { int n; cin >> n; vector<string> s(n); REP(i,n) cin >> s[i]; auto f = [](string s) { string t = s; reverse(t.begin(),t.end()); return t == s; }; bool ok = false; REP(i,n) REP(j,n) if (i != j && f(s[i]+s[j])) ok = true; cout << (ok ? "Yes" : "No") << endl; return 0; }
C - Ideal Sheet
10 x 10 マスという制約のため、シート A, B の平行移動を全探索しても間に合う。
透明マスは関係ないので、黒マスだけを比較すれば良い。A, B の黒マスの集合が X の黒マス集合と一致すれば Yes。
#include <bits/stdc++.h> using namespace std; #define REP(i,n) for(int i=0;i<n;i++) #define endl '\n' using P = pair<int,int>; int main() { vector b(3,vector<P>()); REP(i,3) { int h,w; cin >> h >> w; REP(j,h) { string s; cin >> s; REP(k,w) if (s[k] == '#') b[i].emplace_back(j,k); } } set<P> ideal; for(auto [x,y]: b[2]) ideal.emplace(x,y); REP(i,20) REP(j,20) REP(k,20) REP(l,20) { set<P> st; for(auto [x,y]: b[0]) st.emplace(x+i-10,y+j-10); for(auto [x,y]: b[1]) st.emplace(x+k-10,y+l-10); if (st == ideal) { cout << "Yes" << endl; return 0; } } cout << "No" << endl; return 0; }
D - Mismatched Parentheses
stack で括弧マッチングを管理する。 括弧が閉じていたら開始と終了位置メモしておき、最終的に累積和で括弧が閉じている範囲を集計する。
#include <bits/stdc++.h> using namespace std; #define REP(i,n) for(int i=0;i<n;i++) #define endl '\n' using P = pair<char,int>; int main() { int n; cin >> n; string s; cin >> s; stack<P> st; vector<int> sum(n+1); REP(i,n) { if (s[i] == '(') st.emplace('(',i); if (s[i] == ')' && st.size()) { auto [c,idx] = st.top(); if (c == '(') { st.pop(); sum[idx]++; sum[i+1]--; } } } REP(i,n) sum[i+1] += sum[i]; REP(i,n) if (sum[i] == 0) cout << s[i]; return 0; }