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