分析
既然题目要求求出所有四行诗共同的形态,那我们就想到可以用位运算。
我们用二的次方来表示每一种形态,然后把每一篇诗的形态或起来,就可以得到最终的形态。输出的时候再拿个函数转一下就行了。
有了基本框架,我们就可以开始构造特殊情况。题目中说到如果有 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;
}
标签:CF138A,ps,Literature,string,int,j3,str,Lesson,四行
From: https://www.cnblogs.com/forgotmyhandle/p/18000225