gym101612 Consonant Fencity

本文介绍了一种通过位运算优化的字符串匹配算法,该算法适用于特定条件下的字符对匹配问题。通过对字符进行预处理并利用图论的方法,在19*(1<<19)的时间复杂度内求解最优解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:给你一个长度为n的字符串,可以选择一些字符改变为大写,使得满足条件的字符对最多(条件为要求两个字符一个大写一个小写,并且不为元音yuan),问改变后的字符串

题解:首先发现题目规定不是元音的很少,小到可以位运算。。。其实就是直接暴力,枚举那些字符变为大写,这里复杂度(1<<19),1e6计算答案是不可能的,这里的点很少,只要建图直接19*19计算答案,所以最后的复杂度为19*19*(1<<19)

#include <bits/stdc++.h>
#define maxn 1010000
#define INF 0x3f3f3f3f
typedef long long ll;
using namespace std;
int G[300][300], f[300], dir[300], mk[300], mx, ans;
char s[maxn];
int main(){
    //freopen("consonant.in", "r", stdin);reopen("consonant.out", "w", stdout);
    f['a']=f['e']=f['i']=f['o']=f['u']=f['y']=f['w']=1;
    int num = 0;
    for(int i='a';i<='z';i++){
        if(f[i] != 1) dir[i] = num++;
    }
    scanf("%s",s+1);
    int l=strlen(s+1);
    for(int i=1; i<l; ++i){
        G[s[i]][s[i+1]]++;
        G[s[i+1]][s[i]]++;
    }
    for(int st=0; st<(1<<19); ++st){
        int c=0, ma=0;
        for(int i=0; i<19; ++i){
            if(st&(1<<i)) c++;
        }
        if(c>9) continue;
        for(int i='a'+1; i<='z'; ++i){
            if(f[i]) continue;
            int u=dir[i];
            for(int j='a'+1; j<='z'; ++j){
                if(f[j]) continue;
                int v=dir[j];
                if(((st>>u)&1) != ((st>>v)&1)) ma+=G[i][j];
            }
        }
        if(ma > mx) mx=ma, ans=st;
    }
    for(int i='a'; i<='z'; ++i){
        int u = dir[i];
        if(ans&(1<<u)) mk[i]=1;
    }
    for(int i=1; i<=l; ++i){
        if(mk[s[i]]) printf("%c",s[i]-32);
        else printf("%c",s[i]);
    }
    return 0;
}

 

转载于:https://www.cnblogs.com/Noevon/p/7868244.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值