gym 101775 H - Mr. Panda and Birthday Song

题解:

         ①我们要找到是否存在一种(连续元音字母的长度>=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;
}

猜你喜欢

转载自blog.csdn.net/qq_18869763/article/details/83116608