博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ3828 : [Poi2014]Criminals
阅读量:7122 次
发布时间:2019-06-28

本文共 1082 字,大约阅读时间需要 3 分钟。

对于每个位置求出L[i]表示左边最大的j,满足从j开始到i-1中存在第一个子序列

R[i]表示右边最小的j,满足从j开始到i-1中存在第二个子序列

然后枚举颜色是相遇点的位置,如果L[i]左边、R[i]右边存在一样的颜色,则可行

 

#include
#define N 1000010inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}int n,k,m,l,i,j,t,a[N],c[N],nxt[N],loc[N],f[N],L[N],R[N],cnt[N],ret,ans;bool vis[N],can[N];int main(){ read(n),read(k); for(i=1;i<=n;i++)read(c[i]); read(m),read(l); for(i=1;i<=m;i++)read(a[i]); for(i=m+l-1;i>=m;i--)read(a[i]); for(i=1;i<=n;i++)loc[i]=n+1; for(i=n;i;i--)nxt[i]=loc[c[i]],loc[c[i]]=i; for(i=1;i<=n;i++){ L[i]=m>1?f[1]:i; if(c[i]==a[m-1])for(f[m-1]=i,j=m-2;j;j--)while((t=f[j]?nxt[f[j]]:loc[a[j]])
1?f[m+l-1]:i; if(c[i]==a[m+1])for(f[m+1]=i,j=m+2;j
<=n?nxt[f[j]]:loc[a[j]])>f[j-1])f[j]=t; } for(i=1;i<=n;i++)if(L[i]>1&&R[i]
R[i];j--)cnt[c[j]]++; for(j=1;j
=n)break; for(j=R[i];j>R[i-1];j--)if(!(--cnt[c[j]])&&vis[c[j]])ret--,vis[c[j]]=0; for(j=L[i-1];j

  

 

转载地址:http://faxel.baihongyu.com/

你可能感兴趣的文章
Oracle优化:千万级大表逻辑判断的累赘
查看>>
研讨会记录|与Xamarin工作簿研讨会探索UrhoSharp 3D
查看>>
python join 和 split的常用使用方法
查看>>
Oracle数据库日常管理之数据备份,恢复及迁移 (第八讲 )
查看>>
一段Winrunner的样例脚本
查看>>
IPSec应用方案设计
查看>>
FOSCommentBundle功能包:创建您的评论类和线索类
查看>>
C++动态数组再总结
查看>>
如何通过sar快速定位制约系统性能的瓶颈
查看>>
Java 枚举用法详解
查看>>
走在网页游戏开发的路上(十一)
查看>>
oc58--Category注意事项
查看>>
Linux下安装OpenOffice
查看>>
C# 在根据窗体中的表格数据生成word文档时出错
查看>>
Java事务处理类(源码)
查看>>
JAVA 设计模式 访问者模式
查看>>
SQL Server清空日志及所有表的数据
查看>>
浅谈ThreadPool 线程池
查看>>
J2EE实现XML文件的读取与导出(源码)
查看>>
Azure Backup (2) Azure备份服务
查看>>