题解:
①我们要找到是否存在一种(连续元音字母的长度>=x的填字母的方法,或者连续辅音字母的长度>=y的方法)满足一种就存在一种DISLIKE的songs。这种情况直接贪心就好,‘?’的地方全填元音,或者全填辅音。
②我们还要找到一种情况(连续的元音字母的长度<x并且连续的辅音字母的长度<y)这种填字母方式要同时满足两种情况。
考虑到如果当前为连续的元音字母的话,那么连续的辅音字母的长度一定为0。
反之如果当前为连续的辅音字母的话,那么连续的元音字母的长度一定为0。
因为有这种性质,我们就可以分开dp,考虑当前是连续的元音还是辅音。
#include"bits/stdc++.h"
using namespace std;
typedef long long LL;
const int MX = 1e6+7;
const int INF = 0x3f3f3f3f;
int n;
char s[MX];
bool ch[256];
int x,y;
int dp[MX][2];
void init()
{
ch['a'] = ch['e'] = ch['i'] = ch['o'] = ch['u'] = 1;
}
inline void upd0(int i)
{
dp[i][0] = dp[i-1][0] + 1;
dp[i][1] = 0;
}
inline void upd1(int i)
{
dp[i][1] = dp[i-1][1] + 1;
dp[i][0] = 0;
}
bool get_mav()
{
dp[0][0] = dp[0][1] = 0;
for(int i = 1; i <= n; i++){
if(s[i] == '?'){
upd0(i);
}
else if(ch[s[i]]){
upd0(i);
}
else{
upd1(i);
}
if(dp[i][0] >= x || dp[i][1] >= y) return 1;
}
return 0;
}
bool get_mac()
{
dp[0][0] = dp[0][1] = 0;
for(int i = 1; i <= n; i++){
if(s[i] == '?'){
upd1(i);
}
else if(ch[s[i]]){
upd0(i);
}
else{
upd1(i);
}
if(dp[i][0] >= x || dp[i][1] >= y) return 1;
}
return 0;
}
bool get_min()
{
for(int i = 0; i <= n; i++)
dp[i][0] = dp[i][1] = INF;
dp[0][0] = dp[0][1] = 0;
for(int i = 1; i <= n; i++){
if(s[i] == '?'){
if(dp[i-1][0] < x){
dp[i][0] = min(dp[i][0], dp[i-1][0]+1);
dp[i][1] = min(dp[i][1], 1);
}
if(dp[i-1][1] < y){
dp[i][1] = min(dp[i][1], dp[i-1][1]+1);
dp[i][0] = min(dp[i][0], 1);
}
}
else if(ch[s[i]]){
if(dp[i-1][0] < x){
dp[i][0] = min(dp[i][0],dp[i-1][0]+1);
}
if(dp[i-1][1] < y){
dp[i][0] = min(dp[i][0],1);
}
}
else{
if(dp[i-1][1] < y){
dp[i][1] = min(dp[i][1],dp[i-1][1] + 1);
}
if(dp[i-1][0] < x){
dp[i][1] = min(dp[i][1],1);
}
}
if(dp[i][0] >= x && dp[i][1] >= y) return 0;
}
return 1;
}
int main()
{
#ifdef LOCAL
freopen("input.txt","r",stdin);
#endif // LOCAL
int T,cas = 0;
init();
scanf("%d",&T);
while(T--) {
scanf("%s %d %d",s+1,&x,&y);
printf("Case #%d: ",++cas);
n = strlen(s+1);
bool maxx = 0, minx = 0;
maxx |= get_mav();
maxx |= get_mac();
minx |= get_min();
if(!maxx) printf("LIKE\n");
else if(!minx) printf("DISLIKE\n");
else printf("SURPRISE\n");
}
return 0;
}