社区讨论

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 条回复,欢迎继续交流。

正在加载回复...