2024-10-17 模拟赛总结

\(100+50+10+0=160\),码力不够 T2 没调出来,死磕 T2 没打出 T4 暴力。

A - 语言 / language

题意:

A 为形容词,N 为名词,V 为动词,用 a~z 的字母来表示每一个词语,没一个词语可能既是形容词又是名词,其他同理,一个名词性词语 \(NP::=N|A+NP_1|NP_1+NP_2\),一个句子 \(S=NP_1+V+NP_2\)。给定一组词语,问这一组词语顺序拼接是否是一个句子。

思路:

考虑到一个名词性词语的结尾一定是名词,且一个句子一定只有一个动词,若必须动词的个数大于二显然不成句子,否则我们可以枚举动词然后直接判断两边是否是名词性词语即可。

代码:

#include <bits/stdc++.h>

using namespace std;

const int kMaxN = 1e5 + 5;

int T, c[26];
string s;
vector<int> v[8], vec;

bool C(int l, int r) {
  for (int i = l; i <= r; i++) {
    if (c[s[i] - 'a'] != 1 || c[s[i] - 'a'] != 5) {
      return 1;
    }
  }
  return 0;
}

int main() {
  freopen("language.in", "r", stdin);
  freopen("language.out", "w", stdout);
  ios::sync_with_stdio(0), cin.tie(0);
  for (cin >> T; T; T--, fill(c, c + 26, 0), vec.clear()) {
    for (int i = 0; i < 26; i++) {
      cin >> c[i];
    }
    cin >> s;
    for (int i = 0; i < s.size(); i++) {
      v[c[s[i] - 'a']].push_back(i);
      if (c[s[i] - 'a'] >= 5) vec.push_back(i);
    }
    if (v[4].size() > 1) {
      cout << "No\n";
    } else if (v[4].size() == 1) {
      cout << (C(0, v[4][0] - 1) && C(v[4][0] + 1, s.size() - 1) && (c[s[v[4][0] - 1] - 'a'] >> 1 & 1) && (c[s.back() - 'a'] >> 1 & 1) ? "Yes\n" : "No\n");
    } else {
      bool flag = 0;
      for (int i : vec) {
        flag |= i && i != s.size() - 1 && (c[s[i - 1] - 'a'] >> 1 & 1) && (c[s.back() - 'a'] >> 1 & 1);
      }
      cout << (flag ? "Yes\n" : "No\n");
    }
    for (int i = 0; i < 8; i++) {
      v[i].clear();
    }
  }
  return 0;
}

B - 色球 / ball

题意:

posted @ 2024-10-18 21:53  liruixiong0101  阅读(4)  评论(0编辑  收藏  举报