Codeforces 138 A. Literature Lesson

問題

二つの文字列がrhymeであるとは、
それぞれの文字列の後ろからk番目の母音以降の部分文字列が一致することを言う。
(母音の数がkより少ない文字列はいかなる文字列ともrhymeしない)


4*n行からなる詩がある。
n段全てがaabb型、abba型、abab型、aaaa型のどれか一種類だけのrhymeをしているとき、
詩が全体でaabb型、abba型、abab型、aaaa型のrhymeをしているという。


詩およびkが与えられるとき、詩の音韻の型を求めよ。

制約条件

n≦2500
k≦5
文字列の長さの和は10^4を超えない

方針

定義にしたがって判定すればいい。
aaaa型であることは、aabb型かつabab型をしていることに同値であるのでそれで判断すればいい。

ソースコード

int n,k;
string in[4];

void run(){
  cin>>n>>k;
  bool aabb=1,abab=1,abba=1;
  rep(i,n){
    rep(j,4){
      cin>>in[j];
      int p=in[j].size()-1, c=k;
      #define vowel(x) x=='a'||x=='i'||x=='u'||x=='e'||x=='o'
      for(c=k;c>0&&p>=0;p--)if(vowel(in[j][p]))c--;
      if(c>0){
        cout<<"NO"<<endl; return;
      }
      in[j]=in[j].substr(p+1);
    }
    if(in[0]!=in[1]||in[2]!=in[3])aabb=0;
    if(in[0]!=in[2]||in[1]!=in[3])abab=0;
    if(in[0]!=in[3]||in[1]!=in[2])abba=0;
  }
  if(aabb&&abab)cout<<"aaaa"<<endl;
  else if(aabb)cout<<"aabb"<<endl;
  else if(abab)cout<<"abab"<<endl;
  else if(abba)cout<<"abba"<<endl;
  else cout<<"NO"<<endl;
}