CF138A Literature Lesson

原题传送门

分析

既然题目要求求出所有四行诗共同的形态,那我们就想到可以用位运算。
我们用二的次方来表示每一种形态,然后把每一篇诗的形态或起来,就可以得到最终的形态。输出的时候再拿个函数转一下就行了。

有了基本框架,我们就可以开始构造特殊情况。题目中说到如果有 aaaa 这种类型,那么它可以等同于任何别的类型。根据这个特征,我们可以规定这种类型为 0,这样它对答案就没有影响。题目中又说如果几篇四行诗中只要有一篇不属于任何类型,那这几篇四行诗就都不属于任何类型。所以可以将不属于任何类型的四行诗归为 7,也就是二进制 111,这样无论谁跟他或,都还是错误。

对于别的类型,如果在给出的几篇四行诗中有任意两篇类型不同,那或出来的答案就不是二的次方,所以在最终翻译答案的函数中,可以只翻译所有二的次方,其他一概判错。当然还要记得 aaaa 这种类型。

代码

#include <iostream>
using namespace std;
int n, k;
string err = "";
string getsuf(string str) { // 《大 膜 你》,如题目要求 
    int sise = str.size(), vcnt = 0;
    string ret;
    for (int i = sise - 1; i >= 0; i--) {
        vcnt += (str[i] == 'a' || str[i] == 'e' || str[i] == 'i' || str[i] == 'o' || str[i] == 'u');
        ret += str[i];
        if (vcnt == k) {
            return ret;
        }
    }
    err += "/"; // 元音不够,返回错误,但是错误每次都要改变,不然可能会误判 
    return err;
}
struct poem { // 结构体用于存储每一篇四行诗 
    int r;    // r 代表该四行诗的类型 
    string s1, s2, s3, s4; // 四行诗,所以四行(笑
    void getr() {          // 用于获取当前四行诗的类型 
        string j1 = getsuf(s1), j2 = getsuf(s2), j3 = getsuf(s3), j4 = getsuf(s4); // 每句话的后缀 
        if (j1 == j2 && j2 == j3 && j3 == j4)                                      // 每个后缀都相等,aaaa 
            r = 0;
        else if (j1 == j2 && j3 == j4) 
            r = 1;
        else if (j1 == j3 && j2 == j4) 
            r = 2;
        else if (j1 == j4 && j2 == j3) 
            r = 4;
        else                                                                       // 不属于任何类型,错误 
            r = 7;
    }
} ps[2505];
string conv(int tp) { // 用于把整形的答案转成输出的答案 
    return (tp == 1 ? "aabb" : (tp == 2 ? "abab" : (tp == 4 ? "abba" : (tp == 0 ? "aaaa" : "NO"))));
}
int main() {
    int ans = 0;
    cin >> n >> k;
    for (int i = 0; i < n; i++) {
        cin >> ps[i].s1 >> ps[i].s2 >> ps[i].s3 >> ps[i].s4;
        ps[i].getr();
        ans |= ps[i].r; // 好东西 
    }
    cout << conv(ans);
    return 0;
}
posted @ 2024-01-31 21:58  forgotmyhandle  阅读(18)  评论(0)    收藏  举报