AtCoderで入茶を目指して勉強しています。
勉強を継続するために投稿を始めました。
もともとアカウントを作成していましたが、今年の4月から本格的に勉強を始めました。
一応自分用に解法を書いていますが雑です、自分で読み返して困ったら修正します。
私のアカウント
解いた問題
本日解いた問題
A - delete .
A - delete .
解答
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ull = unsigned long long;
using vec = vector<ll>;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define mod 998244353
int main() {
string s;
cin >> s;
string res;
for(int i = 0; i < s.size(); i++){
if(s[i] != '.') res.push_back(s[i]);
}
cout << res << endl;
}
解法
解答を入れておく配列res
を用意しておく。文字列S
の文字が.
以外の場合はres
に文字を入れることで結果が求まる。
B - 3^A
B - 3^A
解答
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ull = unsigned long long;
using vec = vector<ll>;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define mod 998244353
int main() {
int m;
cin >> m;
vector<int> res;
while(m>0){
for(int i = 0; i < 11; i++){
int tmp = pow(3, i);
int nex = pow(3, i+1);
if(m < nex) {
m -= tmp;
res.push_back(i);
break;
}
}
}
cout << res.size() << endl;
for(int v:res) cout << v << " ";
}
解法
0から10までの3のべき乗を考え、M
よりも小さい場合にA
に加えていくことで結果が求まる。
C - Count ABC Again
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ull = unsigned long long;
using vec = vector<ll>;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define mod 998244353
int main() {
int n, q;
cin >> n >> q;
string s;
cin >> s;
int cnt = 0;
for(int j = 0; j <= n-3; j++){
string tmp = s.substr(j, 3);
if(tmp == "ABC") cnt++;
}
for(int i = 0; i < q; i++){
int x;
string c;
cin >> x >> c;
x--;
int add = 0, sub = 0;
if(x-2>=0 && s.substr(x-2,3) == "ABC") sub++;
if(x-1>=0 && s.substr(x-1,3) == "ABC") sub++;
if(s.substr(x, 3) == "ABC") sub++;
s.replace(x, 1, c);
if(x-2>=0 && s.substr(x-2,3) == "ABC") add++;
if(x-1>=0 && s.substr(x-1,3) == "ABC") add++;
if(s.substr(x, 3) == "ABC") add++;
cnt -= sub;
cnt += add;
cout << cnt << endl;
}
}
解法
始めにS
に含まれるABC
の数をカウントしておく。その後、クエリごとに変更する前の文字の前後の部分文字列がABC
である場合にカウントを減らし、変更後の文字の前後の部分文字列がABC
の場合にカウントを増やす。