这个难度不对,我看应该是 普及/提高-。 这是我第一篇题解,如有错误,请及时提出。 希望过审,谢谢!
先是两个函数,分别是判断元音字母和诗的形态的。不用多说。 特别注意 judgeType 函数的顺序,千万不能错。
关键在于主函数。 读入数据,不用多说。我用的是二维 string 数组。 其中,第一维表示第几个四行,第二维表示每个四句话中的每一行。
我又新建的 y 数组,结构同上。用于保存每一句话的“韵”,方便之后的判断。 详细的解释看注释。
特别的,substr 函数,第二个参数可以省略不写,不写,就表示取到底。 例如:
xxxxxxxxxxstring s="I love Luogu";则,s.substr(
接下来,是最关键的部分了。 先对每一个四行绝句判断形态。如果出现不明形态(函数返回 No ),直接结束程序。
最后,建立集合
我们知道, aaaa 可以看作 aabb 、abab 、abba。
所以,aaaa 就可以看作“百搭”,不用管它。无论之后出现怎样的形态, aaaa 都可以匹配上。
其余的,都放进集合
如果没法结束程序:
就说明都是 aaaa,直接 continue 掉了,以至于没有元素可以放进集合。输出 aaaa 即可。
输出那个唯一的形态即可。
注意,iterator 也是可以按照指针处理的,可以用 * 号访问内存中的值。
千万不要抄,小心棕名!
xxxxxxxxxx// 138A Literature Lessonusing namespace std;
inline bool isYuanYin(char c){ return c=='a' || c=='e' || c=='i' || c=='o' || c=='u';} inline string judgeType(string a[]){ if(a[0]==a[1] && a[1]==a[2] && a[2]==a[3]) return "aaaa"; if(a[0]==a[1] && a[2]==a[3]) return "aabb"; if(a[0]==a[3] && a[1]==a[2]) return "abba"; if(a[0]==a[2] && a[1]==a[3]) return "abab"; return "NO";} int main(){ ios_base::sync_with_stdio(false); cin.tie(nullptr); int n; cin>>n; int m; cin>>m; cin.get(); string s[n][4]; for(int i=0; i<n; i++) for(int j=0; j<4; j++) cin>>s[i][j]; string y[n][4]; for(int i=0; i<n; i++) for(int j=0; j<4; j++) { int cnt=0; int k; for(k=s[i][j].size(); k>=0; k--) if(isYuanYin(s[i][j][k])) { cnt++; if(cnt==m) break; } if(cnt==m) y[i][j]=s[i][j].substr(k); else { puts("NO"); //return 1; return 0; } } /* for(int i=0; i<n; i++) { for(int j=0; j<4; j++) cout<<y[i][j]<<endl; cout<<endl; } */ string a[n]; for(int i=0; i<n; i++) { a[i]=judgeType(y[i]); if(a[i]=="NO") { puts("NO"); //return 2; return 0; } } set<string> S; for(int i=0; i<n; i++) { if(a[i]=="aaaa") continue; S.insert(a[i]); if(S.size()>=2) { puts("NO"); //return 3; return 0; } } if(S.empty()) puts("aaaa"); else cout<<*S.begin(); return 0;}
All Rights Reserved 2022 Wang Zhanrui