C. Beautiful Lyrics

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;
        }
    }

}

猜你喜欢

转载自blog.csdn.net/weixin_39132605/article/details/91531936