AtcoderABC232场

A - QQ solverA - QQ solver

AtcoderABC232场_第1张图片AtcoderABC232场_第2张图片

题目大意

要求从一个长度为3的字符串中提取出两个整数a和b,字符串的格式是axb,其中a和b是介于1到9之间(包括11和99)的整数,计算它们的乘积。

思路分析

将字符类型转换为整数类型来提取出a和b,并计算它们的乘积。

时间复杂度

O(1)

AC代码

#include 
using namespace std;

int main() {
  char a, x, b;
  cin >> a >> x >> b;
  cout << (int)(a - '0') * (int)(b - '0') << '\n';
}

B - Caesar Cipher B - Caesar Cipher

AtcoderABC232场_第3张图片AtcoderABC232场_第4张图片

题目大意

判断是否存在一个非负整数K,使得将字符串S中的每个字符向右移动K位后得到字符串T。

思路分析

  • 找到第一个字符对应的K值。根据题目描述,可以通过计算(t[0] - s[0] + 26) % 26来得到K的值。这样做的目的是保证K始终为非负数。
  • 然后,遍历字符串S和T的每个字符,如果发现有任何一个字符经过移动后不等于T中对应位置的字符,则输出"No"。否则,当所有字符移动后与T相等时,输出"Yes"。

时间复杂度

O(n)

AC代码

#include 
using namespace std;

int main() {
  string s, t;
  cin >> s >> t;
  
  int k = (t[0] - s[0] + 26) % 26;
  for (int i = 0; i < (int)s.size(); i++) {
    if ((s[i] - t[i] + 26) % 26 != k) {
      cout << "No" << endl;
      return 0;
    }
  }
  cout << "Yes" << endl;
  return 0;
}

C - Graph IsomorphismC - Graph Isomorphism

AtcoderABC232场_第5张图片AtcoderABC232场_第6张图片AtcoderABC232场_第7张图片

题目大意

判断两个玩具是否具有相同的形状。每个玩具由N个球和M根绳索组成。在Takahashi的玩具中,球的编号为1到N,第i根绳索连接了球Ai和球Bi。类似地,在Aoki的玩具中,球的编号也为1到N,第i根绳索连接了球Ci和球Di。

思路分析

通过枚举N个球的排列,并验证条件是否满足。具体来说,对于每个排列P,检查Takahashi玩具中球i和球j是否被绳索连接,应该等价于Aoki玩具中球Pi和球Pj是否被绳索连接。如果存在一个排列P使得这个条件对所有i和j都成立,则可以判断两个玩具具有相同的形状。

时间复杂度

O(N^2 * N!)

AC代码

#include 
using namespace std;

int main() {
    int n, m;
    cin >> n >> m;
    vector<vector<bool>> x(n, vector<bool>(n)), y(n, vector<bool>(n));
    
    // 读取Takahashi玩具的绳索连接关系
    for (int i = 0; i < m; ++i) {
        int a, b;
        cin >> a >> b;
        a -= 1, b -= 1;
        x[a][b] = x[b][a] = true;
    }
    
    // 读取Aoki玩具的绳索连接关系
    for (int i = 0; i < m; ++i) {
        int c, d;
        cin >> c >> d;
        c -= 1, d -= 1;
        y[c][d] = y[d][c] = true;
    }
    
    vector<int> p(n);
    iota(begin(p), end(p), 0);
    
    do {
        bool ok = true;
        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < n; ++j) {
                if (x[i][j] != y[p[i]][p[j]]) {
                    ok = false;
                }
            }
        }
        if (ok) {
            cout << "Yes\n";
            return 0;
        }
    } while (next_permutation(begin(p), end(p)));
    
    cout << "No\n";
}

你可能感兴趣的:(算法)