社区讨论
35(T_T)
B3950[语言月赛 202403] szmgo参与者 3已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @mhjbckpd
- 此快照首次捕获于
- 2025/11/03 23:47 4 个月前
- 此快照最后确认于
- 2025/11/03 23:47 4 个月前
CPP
#include <iostream>
#include <string>
using namespace std;
bool wel(char c) {
return c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u';
}
bool check(string word, string idio) {
string cks[100];
int blo = 0;
int i = 0;
// 拆解习语
while (i < idio.length()) {
if (i < idio.length()-1 && idio[i]=='n' && !wel(idio[i+1])) {
cks[blo++] = "n";
i += 1;
continue;
}
while (i < idio.length() && !wel(idio[i])) i++;
if (i == idio.length()) break;
int j = i;
while (j < idio.length() && !wel(idio[j]) && (j-i < 3)) j++;
cks[blo++] = idio.substr(i, j-i);
i = j;
}
// 匹配单词
int dex = 0;
for (int b=0; b<blo; b++) {
while (dex < word.length()) {
if (dex < word.length()-1 && word[dex]=='n' && !wel(word[dex+1])) {
if (word.substr(dex,1) == "n") {
dex += 1;
break;
}
}
while (dex < word.length() && !wel(word[dex])) dex++;
if (dex == word.length()) return false;
int end = dex;
while (end < word.length() && !wel(word[end]) && (end-dex < 3)) end++;
if (word.substr(dex, end-dex) == cks[b]) {
dex = end;
break;
} else {
dex++;
}
}
if (dex == word.length()) return false;
}
return true;
}
int main() {
int n, q;
cin >> n >> q;
string idi[100];
for (int i=0; i<n; i++) cin >> idi[i];
while (q--) {
string word;
cin >> word;
bool found = false;
for (int i=0; i<n; i++) {
if (check(word, idi[i])) {
found = true;
break;
}
}
if (found) cout << "Yes" << endl;
else cout << "No" << endl;
}
return 0;
}
回复
共 3 条回复,欢迎继续交流。
正在加载回复...