https://codeforc.es/contest/1182/problem/C
题意:按规则拼词
思路:先按元音结尾排序取第二种词,再按数目取第一种词,贪心的先用第一种
词,如果不够,就第二种词可以当第一种用;
#include<algorithm>
#include<set>
#include<queue>
#include<cmath>
#include<cstring>
#include<iostream>
#include<set>
#include<vector>
#include<queue>
#include<cmath>
#include<cstdio>
#include<map>
#include<stack>
#include<string>
#include<bits/stdc++.h>
using namespace std;
#define sfi(i) scanf("%d",&i)
#define sfs(i) scanf("%s",(i))
#define pri(i) printf("%d\n",i)
#define sff(i) scanf("%lf",&i)
#define ll long long
#define ull unsigned long long
#define mem(x,y) memset(x,y,sizeof(x))
#define INF 0x3f3f3f3f
#define eps 1e-16
#define PI acos(-1)
#define lowbit(x) ((x)&(-x))
#define zero(x) (((x)>0?(x):-(x))<eps)
#define fl() printf("flag\n")
#define MOD(x) ((x%mod)+mod)%mod
#define endl '\n'
#define pb push_back
#define lson rt<<1,l,mid
#define rson rt<<1|1,mid+1,r
#define FAST_IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
const int maxn=2e5+9;
const int mod=1e9+7;
inline ll read()
{
ll f=1,x=0;
char ss=getchar();
while(ss<'0'||ss>'9')
{
if(ss=='-')f=-1;ss=getchar();
}
while(ss>='0'&&ss<='9')
{
x=x*10+ss-'0';ss=getchar();
} return f*x;
}
int n;
int cnt=0;
struct node
{
string s;
char c;
int num;
int id;
}a[maxn];
bool ch(char c)
{
if(c=='a'||c=='i'||c=='o'||c=='u'||c=='e')
return 1;
else return 0;
}
bool vis[maxn];
bool cmp(node x,node y)
{
if(x.c==y.c) return x.num<y.num;
else return x.c<y.c;
}
bool cmp2(node x,node y)
{
if(vis[x.id]) return 0;
if(vis[y.id]) return 1;
if(x.num==y.num) return x.c<y.c;
else return x.num<y.num;
}
stack<string>sum1,sum2;
int main()
{
FAST_IO;
//freopen("input.txt","r",stdin);
cin>>n;
for(int i=0;i<n;i++)
{
int num=0;
char c='\0';
string t;
cin>>t;
int len=t.length();
for(int j=0;j<len;j++)
{
if(ch(t[j]))
{
c=t[j];
num++;
}
}
if(num)
{
a[cnt].c=c;
a[cnt].s=t;
a[cnt].num=num;
a[cnt].id=cnt;
cnt++;
}
}
sort(a,a+cnt,cmp);
/*for(int i=0;i<cnt;i++)
{
cout<<a[i].s<<" "<<a[i].c<<" "<<a[i].num<<endl;
}
cout<<endl;*/
for(int i=1;i<cnt;i++)
{
//cout<<a[i].s<<" "<<a[i].c<<" "<<a[i].num<<endl;
if(a[i].c==a[i-1].c&&a[i].num==a[i-1].num&&!vis[a[i].id]&&!vis[a[i-1].id])
{
//cout<<a[i-1].s<<" "<<a[i].s<<endl;
sum1.push(a[i].s);
sum1.push(a[i-1].s);
vis[a[i].id]=1;
vis[a[i-1].id]=1;
}
}
sort(a,a+cnt,cmp2);
/*for(int i=0;i<cnt;i++)
{
cout<<a[i].s<<" "<<a[i].c<<" "<<a[i].num<<" "<<vis[a[i].id]<<endl;
}
cout<<endl;*/
for(int i=1;i<cnt;i++)
{
//cout<<a[i].s<<" "<<a[i].c<<" "<<a[i].num<<endl;
if(a[i].num==a[i-1].num&&!vis[a[i].id]&&!vis[a[i-1].id])
{
//cout<<a[i-1].s<<" "<<a[i].s<<endl;
sum2.push(a[i].s);
sum2.push(a[i-1].s);
vis[a[i].id]=1;
vis[a[i-1].id]=1;
}
}
// cout<<sum1.size()<<" "<<sum2.size()<<endl;
/*while(sum1.size())
{
cout<<sum1.top()<<" ";
sum1.pop();
}
cout<<endl;
while(sum2.size())
{
cout<<sum2.top()<<" ";
sum2.pop();
}*/
int ans=0;
bool f=0;
if(sum1.size()>sum2.size())
{
f=1;
ans=sum2.size()/2+(sum1.size()-sum2.size())/4;
}
else
{
ans=sum1.size()/2;
}
cout<<ans<<endl;
if(f)
{
int si1=sum1.size();
int si2=sum2.size();
//fl();
for(int i=0;i<si2/2;i++)
{
cout<<sum2.top()<<" ";
sum2.pop();
cout<<sum1.top()<<" ";
sum1.pop();
cout<<endl;
cout<<sum2.top()<<" ";
sum2.pop();
cout<<sum1.top()<<" ";
sum1.pop();
cout<<endl;
}
//cout<<ans-si2/2<<endl;
for(int i=0;i<ans-si2/2;i++)
{
string ss=sum1.top();
sum1.pop();
string sss=sum1.top();
sum1.pop();
string tt=sum1.top();
sum1.pop();
string ttt=sum1.top();
sum1.pop();
cout<<ss<<" "<<tt<<endl;
cout<<sss<<" "<<ttt<<endl;
}
}
else
{
for(int i=0;i<ans;i++)
{
cout<<sum2.top()<<" ";
sum2.pop();
cout<<sum1.top()<<" ";
sum1.pop();
cout<<endl;
cout<<sum2.top()<<" ";
sum2.pop();
cout<<sum1.top()<<" ";
sum1.pop();
cout<<endl;
}
}
}