现在的位置: 首页 > 综合 > 正文

CF #99 div1 A.Literature Lesson

2018年04月04日 ⁄ 综合 ⁄ 共 1889字 ⁄ 字号 评论关闭

题意:

给出一个 n,k;

接下来4*k行,每行一个字符串。

对于每行字符串,截取从后开始的第k个元音字母到最后为新的字符串。

四个新的字符串是否组成:"aabb","abba","abab","aaaa"的押韵方式

比较n个组成后的字符串,如果有"aabb"之后还有其他除“aaaa”之外的押韵方式,则输出no。

如果只有aaaa,则输出aaaa.

aaaa和任意字符串押韵方式输出后者。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
#include <cmath>
#include <cstring>
#include <queue>
#include <set>
#include <vector>
#include <stack>
#include <map>
#include <iomanip>
#define PI acos(-1.0)
#define Max 10005
#define inf 1<<28
#define LL(x) (x<<1)
#define RR(x)(x<<1|1)
using namespace std;

char a[5][Max];
int key[5][Max];
int k;
int judge(char x)//判断是否元音
{
    if(x=='a'||x=='e'||x=='i'||x=='o'||x=='u')
        return 1;
    return 0;
}
bool visit[10];
int check(char a[],char b[],char c[],char d[],int posa,int posb,int posc,int posd)//4个字符串比较后的新串
{
    int la=strlen(a),lb=strlen(b),lc=strlen(c),ld=strlen(d);
    string aa,bb,cc,dd;
    aa=a,bb=b,cc=c,dd=d;
    string aaa,bbb,ccc,ddd;
    aaa.assign(aa,key[posa][k],la-key[posa][k]);
    bbb.assign(bb,key[posb][k],lb-key[posb][k]);
    ccc.assign(cc,key[posc][k],lc-key[posc][k]);
    ddd.assign(dd,key[posd][k],ld-key[posd][k]);
    if(aaa==bbb&&bbb==ccc&&ccc==ddd)//aaaa
        return 1;
    else if(aaa==bbb&&aaa!=ccc&&ccc==ddd)//aabb
        return 2;
    else if(aaa==ccc&&bbb==ddd&&aaa!=bbb)//abab
        return 3;
    if(aaa==ddd&&bbb==ccc&&aaa!=bbb)//abba
        return 4;
    return 5;//NO
}
void out(int xx)
{
    if(xx==2)
        cout<<"aabb"<<endl;
    else if(xx==3)
        cout<<"abab"<<endl;
    else if(xx==4)
        cout<<"abba"<<endl;
}
int main()
{
    int i,j,l,n,m;
    while(scanf("%d%d",&n,&k)!=EOF)
    {
        memset(visit,0,sizeof(visit));

        while(n--)
        {
            memset(key,0,sizeof(key));
            for(i=1; i<=4; ++i)
            {
                scanf("%s",a[i]);
                l=strlen(a[i]);
                int num=1;
                for(j=l-1; j>=0; --j)
                {
                    if(judge(a[i][j]))
                        key[i][num++]=j;//记录元音出现的位置
                }
                if(num<k+1)//如果字符串元音的个数小于k, 则输出NO
                visit[5]=1;
            }
            int xx=check(a[1],a[2],a[3],a[4],1,2,3,4);
            visit[xx]++;
        }
        int ok=0;
        for(i=2; i<=4; i++)//判断是否有2个或者以上的不同的押韵方式
            for(j=i+1; j<=4; j++)
                if(visit[i]&&visit[j])
                {
                    ok=1;
                    break;
                }
        if(visit[5]||ok)
            cout<<"NO"<<endl;
        else
        {
            ok=0;
            for(i=2; i<=4; i++)
                if(visit[i])
                {
                    out(i);
                    ok=1;
                    break;
                }
            if(!ok)
                cout<<"aaaa"<<endl;
        }
    }
    return 0;
}

理解题意很重要啊。。。

抱歉!评论已关闭.