[硫化铂]开心消消乐

2024-03-16 22:32
文章标签 开心 硫化 消消

本文主要是介绍[硫化铂]开心消消乐,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

开心消消乐

题目概述

在这里插入图片描述
在这里插入图片描述

题解

首先很容易联想到 Gym 102586J 于是我们自然而然可以想到通过建立一个dfa来处理。
但显然,我们这个dfa怎么建才是关键。

我们观察到我们每次是将三个连续的字符脱水缩合成一个字符,事实上我们每次可以将前面的两个字符当成一个函数,而最后一位当作传入函数的参数。
实际上, 我们发现,我们的每次操作相当于以最后一个数作为参数,将前面的函数不断嵌套。
而我们的函数总共只有四种:不变,交换位置,全赋 0 / 1 0/1 0/1,它们之间的嵌套是具有封闭性的,即无论怎么嵌套都是这四种函数之一。
由于我们每次的操作都是针对一个前缀的,我们不妨记录下我们这些前缀能够构造出上面的哪些函数,记 d p i , j dp_{i,j} dpi,j表示我们使用长度为 i i i的前缀,可以构造出的函数集合为 j j j
显然,当加入的两个字符确定时,我们函数集合可以有两种变化,一是用 h ( x ) = f ( g ( x ) ) h(x)=f(g(x)) h(x)=f(g(x))的方式,与前面的函数嵌套起来,一是将第一个字符传到前面的函数中,用返回值和后一个字符得到新的函数。
这两种方式得到函数集合的并,就是我们转移到的新函数集合。
我们可以通过这种方式,确定我们转移到的集合。但由于加入的两个字符不是确定的,所以我们还得去枚举新加入的字符。
我们不妨将我们的函数集合就看做dfa上的点,而加入的字符就看做dfa上的边,那我们的整个过程就是在dfa上跑dp。
显然,我们可以先将这个dfa的图预处理出来,然后在上面跑就行了。

时间复杂度 O ( T n ) O\left(Tn\right) O(Tn),不过还有个 2 5 2^5 25的常数。

源码

#include<bits/stdc++.h>
using namespace std;
#define MAXM (1<<4)+5
#define MAXN 100005
#define lowbit(x) (x&-x)
#define reg register
#define pb push_back
#define mkpr make_pair
#define fir first
#define sec second
#define lson (rt<<1)
#define rson (rt<<1|1)
typedef long long LL;
typedef unsigned long long uLL; 
typedef long double ld;
typedef pair<int,int> pii;
const int INF=0x3f3f3f3f;
const int mo=998244353;
const int mod=1e5+3;
const int inv2=499122177;
const int jzm=2333;
const int zero=2000;
const int n1=2000;
const int M=100000;
const int orG=3,ivG=332748118;
const long double Pi=acos(-1.0);
const double eps=1e-12;
template<typename _T>
_T Fabs(_T x){return x<0?-x:x;}
template<typename _T>
void read(_T &x){_T f=1;x=0;char s=getchar();while(s>'9'||s<'0'){if(s=='-')f=-1;s=getchar();}while('0'<=s&&s<='9'){x=(x<<3)+(x<<1)+(s^48);s=getchar();}x*=f;
}
template<typename _T>
void print(_T x){if(x<0){x=(~x)+1;putchar('-');}if(x>9)print(x/10);putchar(x%10+'0');}
int gcd(int a,int b){return !b?a:gcd(b,a%b);}
int add(int x,int y,int p){return x+y<p?x+y:x+y-p;}
void Add(int &x,int y,int p){x=add(x,y,p);}
int qkpow(int a,int s,int p){int t=1;while(s){if(s&1)t=1ll*t*a%p;a=1ll*a*a%p;s>>=1;}return t;}
int n,T,a[10],typ[5],b[MAXN],dp[2][MAXM],tur[5][5],nxt[20][5],ans;
char str[MAXN];
int match(int x,int y){return (x^y)?x:2+x;}
int ask(int x,int y){return x>1?x-2:(x^y);}
signed main(){freopen("game.in","r",stdin);freopen("game.out","w",stdout);read(T);tur[0][0]=0;tur[0][1]=1;tur[0][2]=2;tur[0][3]=3;tur[1][0]=1;tur[1][1]=0;tur[1][2]=3;tur[1][3]=2;tur[2][0]=tur[2][1]=tur[2][2]=tur[2][3]=2;tur[3][0]=tur[3][1]=tur[3][2]=tur[3][3]=3;while(T--){for(int i=0;i<8;i++)scanf("%1d",&a[i]);for(int i=0;i<4;i++)typ[i]=match(a[i],a[i+4]);scanf("\n%s",str+1);n=(int)strlen(str+1);for(int i=1;i<=n;i++)b[i]=(str[i]=='?'?2:((str[i]-'0')^1)),str[i]=0;for(int i=0;i<2;i++)for(int j=0;j<16;j++)dp[i][j]=0;int now=0,las=1;dp[now][1]=1;for(int i=0;i<16;i++)for(int k1=0;k1<2;k1++)for(int k2=0;k2<2;k2++){int S=k1|(k2<<1);nxt[i][S]=0;for(int j=0;j<4;j++)if((i>>j)&1)nxt[i][S]|=(1<<tur[j][typ[S]]);for(int j=0;j<4;j++)if((i>>j)&1)nxt[i][S]|=(1<<typ[ask(j,k1)|(k2<<1)]);}for(int i=1;i<n;i+=2){swap(now,las);for(int j=0;j<16;j++)dp[now][j]=0;for(int k1=0;k1<2;k1++)if(b[i]^k1)for(int k2=0;k2<2;k2++)if(b[i+1]^k2)for(int j=0;j<16;j++)if(dp[las][j])Add(dp[now][nxt[j][k1|(k2<<1)]],dp[las][j],mo);}for(int i=0;i<2;i++)if(b[n]^i)for(int j=0;j<16;j++)if(dp[now][j]){bool flag=0;for(int k=0;k<4;k++)if((j>>k)&1)flag|=ask(k,i);if(flag)Add(ans,dp[now][j],mo);}printf("%d\n",ans);ans=0;}return 0;
}

谢谢!!!

这篇关于[硫化铂]开心消消乐的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/816938

相关文章

不管是开心还是伤心,都需要有人能够分享

在我们的生活中,有很多事都是需要我们和别人分享的。我们自己一个人能独自承受的东西很少,我们需要的是有人能够陪着我们,能够和我们一起分享。有人和我们一起分享,我们能够将快乐传递,将悲伤消灭。

带AI功能朵米客服系统3.5无限制开心版+搭建文档

带AI功能朵米客服系统3.5无限制开心版+搭建文档,朵米客服系统是一款全功能的客户服务解决方案,提供多渠道支持(如在线聊天、邮件、电话等),帮助企业建立与客户的实时互动。该系统具有智能分流功能,可以快速将客户请求分配给适当的客服人员,提高工作效率。同时,朵米客服系统还提供丰富的数据分析和报告功能,帮助企业了解客户需求和行为,从而优化服务质量。总体而言,朵米客服系统致力于提升客户体验,提高客服效率,

day-49 让所有学生保持开心的分组方法数

思路 利用Collections.sort()函数对数组进行排序,依次向后遍历即可,如果nums.get(i)<i+1&&nums.get(i+1)>i+1 解题过程 注意特殊情况:全选和不选要单独讨论 Code class Solution {public int countWays(List<Integer> nums) {int len=nums.size();Collections

数学题--2860. 让所有学生保持开心的分组方法数

2860. 让所有学生保持开心的分组方法数 给你一个下标从 0 开始、长度为 n 的整数数组 nums ,其中 n 是班级中学生的总数。班主任希望能够在让所有学生保持开心的情况下选出一组学生: 如果能够满足下述两个条件之一,则认为第 i 位学生将会保持开心: 这位学生被选中,并且被选中的学生人数 严格大于 nums[i] 。这位学生没有被选中,并且被选中的学生人数 严格小于 nums[i]

[M排序] lc2860. 让所有学生保持开心的分组方法数(排序+贪心+简洁代码实现+思维)

文章目录 1. 题目来源2. 题目解析 1. 题目来源 链接:2860. 让所有学生保持开心的分组方法数 题单: 思维 01.1、思维 2. 题目解析 有一定的思考难度,不太好归类,就放到 思维 里面吧。 思路: 首先分析题目中的一些关键信息,能得出来,选法是唯一的,且选的话,会把小于当前值的前面部分全部选了。那么此时问题就转化为 选0、选1、选2…选n 个的问题

WordPress 资源展示型下载类主题 CeoMax-Pro_v7.6 开心版

WordPress 资源展示型下载类主题 CeoMax-Pro_v7.6 开心版; CeoMax-Pro是一款极致美观强大的WordPress付费资源下载主题,它能满足您所有付费资源下载的业务需求! 你的想法与业务不能被主题所限制!CeoMax-Pro强大的功能,在不久的将来它能实现你一切幻想!我们也在为此而不断努力。 适用于资源站、下载站、交易站、素材站、源码站、课程站、CMS等等等等,它

开心第一课:健康坐姿

文章目录 引言保持脊柱的自然伸展选择一把合适的座椅 引言 建议坐位时间超过 30 分钟,就起身活动一下,促进血液循环,预防久坐带来的各种健康问题。 保持脊柱的自然伸展 正确的骨盆位置是使坐位时身体重量都作用在双侧的坐骨结节上,在结节的顶端有滑囊,滑囊分泌液体减少组织间的摩擦和压力。 坐位时,摸到臀部下方的一个骨性突起就是坐骨结节。 腰椎和胸椎保持自然的曲度,臀

Guitar Pro 8.2.1 Build 32+Soundbanks Win/Mac音色库 开心激活版 音乐软件Guitar Pro 8中文破解版

音乐软件Guitar Pro 8中文破解版是一个受吉他手喜爱的吉他和弦、六线谱、BASS 四线谱绘制、打印、查看、试听软件,它也是一款优秀的 MIDI 音序器,MIDI 制作辅助工具,可以输出标准格式的 MIDI。GP 的过人之处就在于它可以直接用鼠标和键盘按标准的六线谱、四线谱进行乐谱输入、查看、打印和试听(可以实时、自动滚屏、多种模式的显示单声部或乐曲总谱),在做弹拨乐器的滑音、倚音、推弦、揉

nyoj49 开心的小明

开心的小明 时间限制: 1000 ms  |  内存限制: 65535 KB 难度: 4 描述 小明今天很开心,家里购置的新房就要领钥匙了,新房里有一间他自己专用的很宽敞的房间。更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过N 元钱就行”。今天一早小明就开始做预算,但是他想买的东西太多了,肯定会超过妈妈限定的N 元。于是,他把每件物品

亲测Wordpress主题RiPro子主题V8.1开心版 小八子主题v8.1版源码完整版分享

已经测试过了,无后门,可以使用。 XB-RiPro是一个最牛逼的子主题,首页拖拽布局,高级筛选, 自带会员生态系统,超全支付接口,你喜欢的样子我都有! XB-RiPro子主题,更强大的全资源/素材类主题, 无需插件,集成强大的支付,后台管理,用户体验舒服。 支持卡密,任务发布,自助广告,在线工单,充值, 积分,会员,高级筛选,推广佣金,作者佣金,前台创建文章,统计,自定义币种,自定义会员标识