(1)思路:
将n个字符串分为两类,
末尾元音数量相同,并且末尾元音一样的分为一类;数量即为t1
否则末尾元音数量相同的分为一类;数量即为t2
如果t1大于t2,就将t1后面多出来的放到t2后面。
这里需要平均分配(当时可能是这里写错了,所以一直出错)。
(2)代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<vector>
using namespace std;
const int maxn = 1e5+10;
string ss[maxn];
int vis[maxn]={0};
struct Node{
int id,num;
char ch;
}cur[maxn];
vector <Node> vc;
struct node{
int p1,p2;
};
node v1[maxn],v2[maxn];
bool cmp(Node a,Node b){
if(a.num!=b.num) return a.num<b.num;
return a.ch<b.ch;
}
int MIN(int x,int y){
return x<y?x:y;
}
int main(void){
int n;cin>>n;
for(int i=1;i<=n;i++){
cin>>ss[i];
cur[i].id = i;
cur[i].num = 0;
int len = ss[i].length();
for(int j=0;j<len;j++)
if(ss[i][j]=='a'||ss[i][j]=='e'||ss[i][j]=='i'||ss[i][j]=='o'||ss[i][j]=='u'){
cur[i].num++;cur[i].ch = ss[i][j];
}
}
sort(cur+1,cur+1+n,cmp);
int t1 = 0,t2 = 0;
vc.clear();
for(int i=2;i<=n;i++)
if(vis[i]==0&&vis[i-1]==0&&cur[i].ch==cur[i-1].ch&&cur[i].num==cur[i-1].num){
vis[i] = vis[i-1] = 1;
v1[++t1] = {cur[i-1].id,cur[i].id};
}
for(int i=1;i<=n;i++)
if(vis[i]==0) vc.push_back(cur[i]);
else vis[i] = 0;
int m = vc.size();
for(int i=1;i<m;i++)
if(vis[i]==0&&vis[i-1]==0&&vc[i-1].num==vc[i].num){
vis[i] = vis[i-1] = 1;
v2[++t2] = {vc[i-1].id,vc[i].id};
}
if(t1>t2){
int x = (t1-t2)/2;
for(int i=1;i<=x;i++) v2[t2+i] = v1[t1-i+1];
t2 += x;
t1 -= x;
}
int len = MIN(t1,t2);
cout<<len<<endl;
for(int i=1;i<=len;i++){
cout<<ss[v2[i].p1]<<" "<<ss[v1[i].p1]<<endl;
cout<<ss[v2[i].p2]<<" "<<ss[v1[i].p2]<<endl;
}
return 0;
}