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;
}