Codeforces Round #566 (Div. 2)C(字符串,SET)

Posted ldudxy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #566 (Div. 2)C(字符串,SET)相关的知识,希望对你有一定的参考价值。

#include<bits/stdc++.h>
using namespace std;
string s[100007];
set<int>st[100007][7];
int t[207];
int a[100007],b[100007][2],c[100007],d[100007][2];
int main()
t[‘a‘]=1;
t[‘e‘]=2;
t[‘i‘]=3;
t[‘o‘]=4;
t[‘u‘]=5;
int n;
cin>>n;
for(int i=1;i<=n;++i)
cin>>s[i];
int cnt=0;
char last;
for(int j=0;j<s[i].length();++j)
if(s[i][j]==‘a‘||s[i][j]==‘e‘||s[i][j]==‘i‘||s[i][j]==‘o‘||s[i][j]==‘u‘)
cnt++;
last=s[i][j];


if(cnt)
st[cnt][t[last]].insert(i);


int cnt1=0,cnt2=0;
int num1=0,num2=0;
for(int i=1;i<=100000;++i)
num1=0;
for(int j=1;j<=5;++j)
num2=0;
for(auto it:st[i][j])
a[++num2]=it;//将有i个元音字母并且结尾元音字母编号为j的字符串序号放进a数组中

for(int k=1;k<num2;k+=2)//将a数组中的字符串成双取出到b数组,他们都拥有相同的元音字母个数和最后一个字母
b[++cnt1][0]=a[k];
b[cnt1][1]=a[k+1];

if(num2&1)//a数组有一个余下的字符串序号
c[++num1]=a[num2];//c数组放成单的字符串序号,他们都拥有相同的元音字母个数i,却没有相同的结尾元音字母

for(int j=1;j<num1;j+=2)//将c数组中的字符串成双取出到d数组,他们都拥有相同的元音字母个数,结尾元音字母不同使得它们只能放在每行的第一个
d[++cnt2][0]=c[j];
d[cnt2][1]=c[j+1];


if(cnt1<=cnt2)//拥有相同元音字母个数的对数少于不同的
cout<<cnt1<<"\n";
for(int i=1;i<=cnt1;++i)
cout<<s[d[i][0]]<<" "<<s[b[i][0]]<<"\n";
cout<<s[d[i][1]]<<" "<<s[b[i][1]]<<"\n";


else
int ans=cnt2+(cnt1-cnt2)/2;//拥有相同元音字母个数的对数较多,优先让它们和不同的进行搭配,再两两自成对
cout<<ans<<"\n";
for(int i=1;i<=cnt2;++i)
cout<<s[d[i][0]]<<" "<<s[b[i][0]]<<"\n";
cout<<s[d[i][1]]<<" "<<s[b[i][1]]<<"\n";

for(int i=cnt2+1;i<cnt1;i+=2)
cout<<s[b[i][0]]<<" "<<s[b[i+1][0]]<<"\n";
cout<<s[b[i][1]]<<" "<<s[b[i+1][1]]<<"\n";


return 0;

以上是关于Codeforces Round #566 (Div. 2)C(字符串,SET)的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Round #566 (Div. 2)

Codeforces Round #566 (Div. 2)题解

Codeforces Round #566 (Div. 2)

Codeforces Round #566 (Div. 2)C(字符串,SET)

Product Oriented Recurrence(Codeforces Round #566 (Div. 2)E+矩阵快速幂+欧拉降幂)

Codeforces Round #436 E. Fire(背包dp+输出路径)