CF1392G-Omkar and Pies【dp】

1|0正题

题目链接:https://www.luogu.com.cn/problem/CF1392G


1|1题目大意

两个长度为k的起始和目标01串。
n个操作交换起始串的两个位置,选择一段长度至少为m的连续操作序列使得相同的位数最多。
1mn106,1k20


1|2解题思路

因为是从前往后操作,所以可以拆成两个后缀[l,n][r+1,n]

S执行ln然后对T执行r+1n之后比较就好了。

额考虑怎么做这个东西,我们可以O(nk)的处理出一个si表示对S执行了in之后的序列,ti表示对T执行了in之后的序列,当然要用二进制压起来。

然后我们要找到一对l,r使得rlmsl xor tr1最多。

有个做法是考虑s and t1数,因为st1数固定。设s and tz1sx1ty1,那么他们相同的位数有z+(kxy+z)=2z+kxy个,所以其实是要最大化z就好了。

fi表示一个最小的k使得sk and i=igi则是表示对于t来说最大的k

然后求出这两个就可以搞定这题了,因为是最值所以不需要用到FWT,直接dp就好了。

时间复杂度O(nk)


1|3code

#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N=1<<20; int k,n,m,s,t,zx[N],zy[N],f[N],g[N],bit[N],rev[N][20]; char st[30]; int swp(int s,int p){ int ans=0; for(int i=0;i<k;i++) ans|=(((s>>rev[p][i])&1)<<i); return ans; } int main() { scanf("%d%d%d",&n,&m,&k); scanf("%s",st); for(int i=0;i<k;i++) s|=(st[i]-'0')*(1<<i); scanf("%s",st); for(int i=0;i<k;i++) t|=(st[i]-'0')*(1<<i); for(int i=1;i<=n;i++){ int x,y; scanf("%d%d",&x,&y);x--;y--; for(int j=0;j<k;j++)rev[i][j]=j; swap(rev[i][x],rev[i][y]); } for(int i=n-1;i>=1;i--){ int tmp[k]; for(int j=0;j<k;j++) tmp[j]=rev[i][rev[i+1][j]]; for(int j=0;j<k;j++)rev[i][j]=tmp[j]; } memset(f,0x3f,sizeof(f)); for(int i=n;i>=1;i--){ int x=swp(s,i);f[x]=min(f[x],i); x=swp(t,i); g[x]=max(g[x],i); } g[t]=n+1;int MS=(1<<k); for(int i=1;i<MS;i++) bit[i]=bit[i-(i&-i)]+1; int ans=-1,ansl=0,ansr=0; for(int i=MS-1;i>=0;i--){ for(int j=0;j<k;j++){ f[i]=min(f[i],f[i|(1<<j)]); g[i]=max(g[i],g[i|(1<<j)]); } if(bit[i]>ans&&g[i]-f[i]>=m) ans=bit[i],ansl=f[i],ansr=g[i]; } printf("%d\n%d %d\n",2*ans+k-bit[s]-bit[t],ansl,ansr-1); return 0; }

__EOF__

本文作者QuantAsk
本文链接https://www.cnblogs.com/QuantAsk/p/14888873.html
关于博主:退役OIer,GD划水选手
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   QuantAsk  阅读(42)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示