这个难度不对,我看应该是 普及/提高-。 这是我第一篇题解,如有错误,请及时提出。 希望过审,谢谢!
先是两个函数,分别是判断元音字母和诗的形态的。不用多说。 特别注意 judgeType 函数的顺序,千万不能错。
关键在于主函数。 读入数据,不用多说。我用的是二维 string 数组。 其中,第一维表示第几个四行,第二维表示每个四句话中的每一行。
我又新建的 y 数组,结构同上。用于保存每一句话的“韵”,方便之后的判断。 详细的解释看注释。
特别的,substr 函数,第二个参数可以省略不写,不写,就表示取到底。 例如:
xxxxxxxxxx
string s="I love Luogu";
则,s.substr(
接下来,是最关键的部分了。 先对每一个四行绝句判断形态。如果出现不明形态(函数返回 No ),直接结束程序。
最后,建立集合
我们知道, aaaa 可以看作 aabb 、abab 、abba。
所以,aaaa 就可以看作“百搭”,不用管它。无论之后出现怎样的形态, aaaa 都可以匹配上。
其余的,都放进集合
如果没法结束程序:
就说明都是 aaaa,直接 continue 掉了,以至于没有元素可以放进集合。输出 aaaa 即可。
输出那个唯一的形态即可。
注意,iterator 也是可以按照指针处理的,可以用 * 号访问内存中的值。
千万不要抄,小心棕名!
xxxxxxxxxx
// 138A Literature Lesson
using 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