Monoxer Programming Contest 2022(AtCoder Beginner Contest 249) - AtCoder の参加メモ
B - Perfect String
- 大文字、小文字の判定
- 配列のユニーク判定
#include <bits/stdc++.h> using namespace std; #define REP(i,n) for(int i=0;i<(n);i++) int main() { string s; cin >> s; int n = s.size(); bool l = false, u = false; set<char> st; for(char c: s) { if ('a' <= c && c <= 'z') l = true; if ('A' <= c && c <= 'Z') u = true; st.insert(c); } bool ok = l && u && (int)st.size() == n; cout << (ok ? "Yes" : "No") << endl; return 0; }
C - Just K
- bit全探索
#include <bits/stdc++.h> using namespace std; #define REP(i,n) for(int i=0;i<(n);i++) int main() { int n,k; cin >> n >> k; vector<string> s(n); REP(i,n) cin >> s[i]; int ans = 0; REP(bit, (1<<n)) { vector<int> m(26); REP(i,n) { if (bit >> i & 1) { for(auto c: s[i]) m[c-'a']++; } } int cnt = 0; for(int v: m) if (v == k) cnt++; ans = max(ans,cnt); } cout << ans << endl; return 0; }
D - Index Trio
- 約数列挙
- 数え上げ
#include <bits/stdc++.h> using namespace std; #define REP(i,n) for(int i=0;i<(n);i++) using ll = long long; vector<int> divisor(int n) { vector<int> res; for(int i = 1; i*i <= n; i++) { if (n % i == 0) { res.push_back(i); if (i != n/i) res.push_back(n/i); } } return res; } int main() { int n; cin >> n; vector<int> a(n); REP(i,n) cin >> a[i]; vector<int> m(200001); vector<bool> used(200001); REP(i,n) m[a[i]]++; ll ans = 0; for(int i: a) { if (used[i]) continue; used[i] = true; for(int j: divisor(i)) { int k = i / j; ans += (ll)m[i] * m[j] * m[k]; } } cout << ans << endl; return 0; }