1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AtCoder 勉強記録[C++] その65

Posted at

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

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の場合にカウントを増やす。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?