几何

news/2024/9/25 16:59:03

几何

比赛时候唐了,连状态都没想到。

记录一下 dp 的惯用优化方法。

思路

(此处串 \(x,y\)\(0\) 开始,串 \(s\)\(1\) 开始)

\(dp[i][j][k]\) 为第 \(i\) 位时,将 \(s[1,i]\) 分为,串 \(x\) 重复若干次加上串 \(x[0,j-1]\),串 \(y\) 重复若干次加上串 \(y[0,k-1]\),的可行性。

如果可以就是 \(1\),不可以就是 \(0\)

\(s[i]==x[j]\),有 \(dp[i+1][(j+1)\mod len_x][k]|=dp[i][j][k]\)

\(s[i]==y[k]\),有 \(dp[i+1][j][(k+1)\mod len_y]|=dp[i][j][k]\)

这样做会超时,考虑优化。

\(k\) 放进状态里。

设状态 \(f[i][j]\) 同上,值为一个二进制数,若二进制数第 \(k\) 位为 \(1\),那么表示 \(dp[i][j][k]=1\)

这样子就把第三维压进了状态里。

对于 \(s[i]==x[j]\),有 \(f[i+1][(j+1)\mod len_x]|=f[i][j]\)

对于第二种转移,\(f[i][j]<<1\) 中为 \(1\) 的位(\(len_y\) 这一位为 \(1\),则循环位移到第 \(0\) 位)即为可以取到的 \(y[k]\)。可以设一个 \(g[x]\) 表示字符 \(x\) 在串 \(y\) 中出现位置的状压,这样就有 \(f[i+1][j]|=(f[i][j]<<1)\& g[s[i]]\)

于是就可以愉快的 AC 了。

CODE

#include<bits/stdc++.h>
using namespace std;#define ll long longconst int maxn=5e5+5;int ns,nx,ny;char s[maxn],x[maxn],y[maxn];ll f[maxn][60],g[30];inline ll work(ll x)
{ll op=(x>>(ny-1))&1;x^=(op<<(ny-1));x=(x<<1)|op;return x;
}
inline void clr()
{for(int i=0;i<=ns+1;i++) for(int j=0;j<=nx+1;j++) f[i][j]=0;for(int i=1;i<=26;i++) g[i]=0;
}
int main()
{int _;scanf("%d",&_);while(_--){cin>>s+1>>x>>y;ns=strlen(s+1),nx=strlen(x),ny=strlen(y);clr();for(int i=0;i<ny;i++) g[y[i]-'a'+1]^=1ll<<i;f[0][0]=1;for(int i=1;i<=ns;i++){int ch=s[i]-'a'+1;for(int j=0;j<nx;j++){if(s[i]==x[j]){f[i][(j+1)%nx]|=f[i-1][j];}ll st=f[i-1][j]&g[ch];f[i][j]|=work(st);}}if(f[ns][0]&1) puts("Yes");else puts("No");}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/64639.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

mongoDB 简介

参考文档       https://www.runoob.com/mongodb/mongodb-tutorial.html  mongoDB 菜鸟教程   https://mongodb.net.cn/manual/  mongoDB 中文官网1. mongoDB 概述 MongoDB 是一个流行的开源文档型数据库,它使用类似 JSON 的文档模型存储数据,这使得数据存储变得…

如何部署北斗定位应用,基于国产自主架构LS2K1000LA-i处理器平台

北斗卫星导航系统(以下简称北斗系统)是着眼于国内经济社会发展需要,自主建设、独立运行的卫星导航系统。经过多年发展,北斗系统已成为面向全球用户提供全天候、全天时、高精度定位、导航与授时服务的重要新型基础设施。图 1 北斗定位系统的应用优势 强可控:北斗系统是国内…

ChatGPT 向更多用户推出高级语音模式:支持 50 种语言;字节发布两款新视频生成大模型丨 RTE 开发者日报

开发者朋友们大家好:这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「有看点的会议」,但内容仅代表编辑的个人观点…

题解:CF573D Bear and Cavalry

CF因为这是远古题目,所以根据现在的评测机速度,用 \(O(nq)\) 的做法也是可以过的。 也就是说,我们可以每次操作直接修改对应位置上的数字,然后设计一种 \(O(n)\) 的算法求解答案。 这道题类似资源分配型动态规划,所以我们可以设 \(dp_i\) 表示分配前 \(i\) 个人的答案。 直…

题解:AT_abc204_e [ABC204E] Rush Hour 2

LG变形的 dijkstra。 先思考什么情况下需要等待以及等待多长时间最优。我们把题目上的计算方法按照当前的时间 \(t\) 和通过所需的时间 \(f(t)\) 列个函数关系: \[f(t)=t+c+\lfloor \frac{d}{t+1}\rfloor \]然后用 Desmos 画个图可以得到图像(其实就是对勾函数):因为 \(c,d…

Rust字符串类型全解析

字符串是每种编程语言都绕不开的类型, 不过,在Rust中,你会看到远比其他语言更加丰富多样的字符串类型。 如下图:为什么Rust中需要这么多种表示字符串的类型呢? 初学Rust时,可能无法理解为什么要这样设计?为什么要给使用字符串带来这么多不必要的复杂性? 其实,Rust中对…

AI自动生成代码注释

在vscode 中安装 TONGYI Lingma