题解:P16429 应试玉符

· · 题解

原题

题意

给定 t 个账号,每个账号有账号名和密码,账号名合法需要满足它是 ZJ-a,其中 a 是一个不超过 9999 的正整数,且若 a 不足 4 位需要用 0 补足,密码合法需要长度不小于 6 且有大小写字母和数字。若账号名不合法则输出 Wrong Name,否则如果密码不合法输出 Wrong Password,否则输出 Accept

思路

这题直接判断,判断账号名:

  1. 长度为 7 且前三位为 ZJ-

  2. 后四位全是数字且有一位非 0

如果有一项不满足账号名就不合法。判断密码就直接枚举每个数用三个变量记录是否有数字、大写字母、小写字母即可。

代码

#include <bits/stdc++.h>

using namespace std;
using ll = long long;

int t;
string n, p;

bool F(char c) {
  return c <= '9' && c >= '0';
}

bool F1(string s) {
  return s[0] == 'Z' && s[1] == 'J' && s[2] == '-' && s.size() == 7 && F(s[3]) && F(s[4]) && F(s[5]) && F(s[6]) && s[3] - '0' + s[4] - '0' + s[5] - '0' + s[6] - '0' > 0;
}

bool F2(string s) {
  bool f1 = 0, f2 = 0, f3 = 0;
  for (char c : s) {
    f1 |= c <= 'Z' && c >= 'A';
    f2 |= c <= 'z' && c >= 'a';
    f3 |= c <= '9' && c >= '0';
  }
  return s.size() >= 6 && f1 && f2 && f3;
}

void solve() {
  cin >> n >> p;
  cout << (!F1(n) ? "Wrong Name\n" : !F2(p) ? "Wrong Password\n" : "Accept\n");
}

int main() {
  ios::sync_with_stdio(0), cin.tie(0);
  cin >> t;
  while (t--) {
    solve();
  }
  return 0;
}