bzoj4278[ONTAK2015]Tasowanie bzoj1692[USACO 2007Dec]队列变换(Best Cow Line) 贪心正确性证明...

做法网上到处都有就不说了.

这题其实是之前做的….不过由于人太傻现在才想明白比较字典序进行贪心的正确性….

方便起见,在两个串的最右端都加上很大但不相同的字符,避免第lcp+1个字符不存在的边界。

如果两个串当前最左端的字符不相同显然选较小的.

否则,设两个剩下的串的lcp长度为x,那么两个串的第lcp+1个字符(此时必然都存在这个字符,因为我们之前在右端加了很大的哨兵)必然不同.不妨假设第一个串的第lcp+1个字符较小.

 

考虑先选第二个串的第1个字符的某种方案.

如果这种方案中,我们先选了第二个串的第lcp+1个字符再选第一个串的第lcp+1个字符,那么把这种方案在选择第二个串的第lcp+1个字符之前的所有操作中选第一个串的操作改为选第二个串,选第二个串的操作改为选第一个串,最后把选择第二个串的第lcp+1个字符改为选择第一个串的第lcp+1个字符,这样得到先选第一个串的第1个字符且字典序更小的方案.

如果这种方案中,我们先选了第一个串的第lcp+1个字符,那么第一次操作后第一个串选了0个字符,第二个串选了1个字符.选择第一个串的第lcp+1个字符后,第一个串选了lcp+1个字符,第二个串选了<=lcp个字符.一开始第二个串选的字符多,最后第一个串选的字符多,因为每次只能进行一个操作,中间必然存在某次操作,使得这次操作后两个串选择的字符数目相同.那么我们把这次操作和这次操作之前的操作都反转一下(即:原先这次操作选第一个串,反转后这次操作选第二个串,原先选第二个串,反转后选第一个串),之后的操作不变,就可以得到一个字典序相同但是先选第一个串的第1个字符的方案.

于是,对于任何一个先选字典序较大的串的方案,我们都可以找到一个至少不会更差的方案先选字典序较小的串.因此最优方案必然是每次选择字典序较小的串.

某奶牛题poj3623&bzoj1692是从一个字符串两侧拿出字符组成字符串要求字典序最小,同样可以分这样两种情况考虑,由选字典序大的一侧方案得到选字典序小的一侧的方案,且使得最终结果不会更差.两侧开始的串的lcp可能会有重叠部分,拿这个串可能会拿着拿着拿到另一端,但仍然可以进行操作的反转,因此还是可以这么证.

#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=400005;
int sa[maxn],rank[maxn];
int tmp1[maxn],tmp2[maxn],key[maxn],sum[maxn];
int a[maxn];
void getsa(int n,int m){int *rk=tmp1,*res=tmp2,i,j,p;for(i=0;i<m;++i)sum[i]=0;for(i=0;i<n;++i)sum[rk[i]=a[i]]++;for(i=1;i<m;++i)sum[i]+=sum[i-1];for(i=n-1;i>=0;--i){sa[--sum[rk[i]]]=i;}for(j=1,p=0;p<n;j<<=1,m=p){for(p=0,i=n-j;i<n;++i)res[p++]=i;for(i=0;i<n;++i)if(sa[i]>=j)res[p++]=sa[i]-j;for(i=0;i<n;++i)key[i]=rk[res[i]];for(i=0;i<m;++i)sum[i]=0;for(i=0;i<n;++i)sum[rk[i]]++;for(i=1;i<m;++i)sum[i]+=sum[i-1];for(i=n-1;i>=0;--i)sa[--sum[key[i]]]=res[i];for(res[sa[0]]=0,p=1,i=1;i<n;++i){if(sa[i]+j<n&&sa[i-1]+j<n&&rk[sa[i]]==rk[sa[i-1]]&&rk[sa[i]+j]==rk[sa[i-1]+j])res[sa[i]]=p-1;else res[sa[i]]=p++;}swap(rk,res);}for(int i=0;i<n;++i)rank[sa[i]]=i;
}
int main(){int n,m;scanf("%d",&n);for(int i=0;i<n;++i)scanf("%d",&a[i]);a[n]=100000;scanf("%d",&m);for(int i=1;i<=m;++i)scanf("%d",&a[n+i]);a[n+m+1]=100000;getsa(n+m+2,100001);int pt1=0,pt2=n+1;int lim=n+m;for(int i=1;i<=lim;++i){printf("%d ",rank[pt1]>rank[pt2]?a[pt2++]:a[pt1++]);}return 0;
}
#include<cstdio>
#include<cctype>
#include<algorithm>
using namespace std;
const int maxn=60005;
int tmp[2][maxn],sum[maxn],key[maxn],sa[maxn],rank[maxn];
char str[maxn];
void getsa(int n,int m){int i,j,k,p,*rk=tmp[0],*res=tmp[1];for(i=0;i<m;++i)sum[i]=0;for(i=0;i<n;++i)sum[rk[i]=str[i]]++;for(i=1;i<m;++i)sum[i]+=sum[i-1];for(i=n-1;i>=0;--i)sa[--sum[rk[i]]]=i;for(j=1,p=0;p<n;m=p,j<<=1){for(i=0;i<m;++i)sum[i]=0;for(p=0,i=n-j;i<n;++i)res[p++]=i;for(i=0;i<n;++i)if(sa[i]>=j)res[p++]=sa[i]-j;for(i=0;i<n;++i)sum[key[i]=rk[res[i]]]++;for(i=1;i<m;++i)sum[i]+=sum[i-1];for(i=n-1;i>=0;--i)sa[--sum[key[i]]]=res[i];for(res[sa[0]]=0,p=1,i=1;i<n;++i){res[sa[i]]=(rk[sa[i]]==rk[sa[i-1]]&&rk[sa[i]+j]==rk[sa[i-1]+j])?p-1:p++;}swap(res,rk);}for(i=0;i<n;++i)rank[sa[i]]=i;
}
int main(){int n;scanf("%d",&n);for(int i=0;i<n;++i){while(str[i]=getchar(),!isgraph(str[i]));}for(int i=0;i<n;++i)str[n+i+1]=str[n-i-1];str[n]='Z'+1;str[2*n+1]='Z'+2;getsa(2*n+2,256);int pt1=0,pt2=n+1;int cnt=0;for(int i=1;i<=n;++i){if(rank[pt1]<rank[pt2]){printf("%c",str[pt1]);pt1++;}else{printf("%c",str[pt2]);pt2++;}cnt++;if(cnt%80==0)printf("\n");}return 0;
}

 

转载于:https://www.cnblogs.com/liu-runda/p/6478318.html

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL约束和修改数据表知识集结

一、约束   划分标准&#xff1a;功能、数据列的数目 功能&#xff1a; &#xff08;1&#xff09;NOT NULL&#xff08;非空约束&#xff09; &#xff08;2&#xff09;PRIMARY KEY&#xff08;主键约束&#xff09; &#xff08;3&#xff09;UNIQUE&#xff08;唯一约束&…

C++注意事项

1. 空字符为NULL,大写转载于:https://www.cnblogs.com/--CYH--/p/6481691.html

论文信息系统项目管理的进度管理

论信息系统项目管理的进度管理 摘要&#xff1a; 2018 年 12 月&#xff0c;我负责了广东省某电力企业“基于 VR 的电力作业仿真培训系统”的项目建设&#xff0c;担任项目经理一职。电力作业技能培训是电力人员上岗前确保安全和保证质量的关键一环&#xff0c;由于传统的电力…

jQuery kxbdMarquee 无缝滚动

转&#xff1a;http://code.ciaoca.com/jquery/kxbdmarquee/ <marquee> 曾是 IE 下独有的一个走马灯效果的标签&#xff0c;其他浏览器并不兼容&#xff0c;于是出现了使用 JavaScript 来模拟该效果的插件。 版本&#xff1a;jQuery v1.3.2下载 jQuery kxbdMarquee查看 D…

论文信息系统项目的进度管理

试题二 论信息系统项目的进度管理 项目进度管理是保证项目的所有工作都在指定的时间内完成的重要管理过程。管理项目进度是每个项目经理在项目管理过程中耗时耗力最多的一项工作&#xff0c;项目进度与项目成本、项目质量密不可分。 请以“信息系统项目的进度管理”为题&…

sql server自动备份

2017-03-01 15:37:44 输入以下代码 1 sp_configure show advanced options, 1; 2 GO 3 RECONFIGURE; 4 GO 5 sp_configure Agent XPs, 1; 6 GO 7 RECONFIGURE 8 GO 转载于:https://www.cnblogs.com/LeslieC/p/6484581.html

IntelliJ IDEA中无法加载jar包导致出现“cannot resolve symbol...”问题的解决

IntelliJ IDEA中无法加载jar包导致出现“cannot resolve symbol...”问题的解决 之前也经常碰到这样的错误&#xff0c;通过reimport、清缓存等方法都可以解决。但这次试了好多次都还是这样&#xff0c;查看maven后发现我pom文件里也没写错。 最后是通过修改这个设置&#xf…

题目1179:阶乘-------------阶乘不用long long int 就不能AC

AC的代码: #include<iostream> using namespace std; long long int fact(int m); int main() {int n;while(cin>>n){long long int sum10,sum20;if (n0) break;int m,p;if (n%20)//n为偶数 {pn;mn-1;}else //n为奇数 {mn;pn-1; // if (p0) break;}int i,j;for …

硬件知识:打印机十个共性故障解决方法

目录 一、 打印机输出空白纸 二、打印纸输出变黑 三、打印字符不全或字符不清晰 3.1 对于针式打印机 3.2 喷墨打印机 四、打印字迹偏淡 4.1 针式打印机 4.2 喷墨打印机&#xff0c; 五、打印时字迹一边清晰而另一边不清晰 六、打印纸上重复出现污迹 6.1 针式打印机 …

HDU 2243 考研路茫茫——单词情结 求长度小于等于L的通路总数的方法

http://acm.hdu.edu.cn/showproblem.php?pid2243 这是一题AC自动机 矩阵快速幂的题目&#xff0c; 首先知道总答案应该是26^1 26^2 26^3 .... 26^L&#xff0c;用等比数列的前n项和是无法做的&#xff0c;因为出现小数。 这个可以直接看到F[n] 26 * F[n - 1] 26&#xf…

为什么需要StringBuffer

(1)为什么需要StringBuffer 由于String的内容是不可变的&#xff0c;在频繁操作字符串的应用中&#xff0c;导致String对象泛滥&#xff0c;不断的被创建和销毁&#xff0c;占用大量的内存和CPU时间。 例如&#xff0c;将十万个"A"连成一个大的字符串。代码如下: 这…

linux下杀毒工具clamav

ClamAV 杀毒是Linux平台最受欢迎的杀毒软件&#xff0c;ClamAV属于免费开源产品&#xff0c;支持多种平台&#xff0c;如&#xff1a;Linux/Unix、MAC OS X、Windows、OpenVMS。ClamAV是基于病毒扫描的命令行工具&#xff0c;但同时也有支持图形界面的ClamTK工具。ClamAV主要用…

深拷贝浅拷贝

深拷贝浅拷贝 数据类型分为两种基础类型和引用类型&#xff1a; 基础类型&#xff1a;int,double等这种为基本类型 引用类型&#xff1a;Object和Array 浅拷贝只是复制了对象的引用地址&#xff0c;两个对象指向同一个内存地址&#xff0c;修改其中任意的值&#xff0c;另一…

shell sort

sort -u seq.txt - 去除重复行。 sort -r number.txt 降序&#xff0c;就加个-r就搞定了 sort -r number.txt -o number.txt 如果你想把排序结果输出到原文件中&#xff0c;用重定向>>可就不行了.-o选项出现了&#xff0c;它成功的解决了这个问题&#xff0c;让你放心的…

猿创征文|2022个人开发工具集积累和分享

目录 1、谷歌浏览器 2、华为浏览器 3、腾讯文档 3、Notepad 4、IntelliJ IDEA 5、VisualStudio 6、VSCode 7、微信开发者工具 8、Navicat 9、PDManer 10、Git/Tortoise Git 11、Axure 12、NxShell 13、ApiPost 14、Xmind 15、Everything 16、WizTree 17、猿如意 今天给大家分享…

在idea里如何实现Git项目回滚

在idea里如何实现Git项目回滚 先我们要回滚的项目右键&#xff0c;如下&#xff1a; 点击Git,再点击Show History 选择你要回滚的分支 然后右键&#xff0c;如下&#xff1a; 点击Copy Revision Number 点击项目&#xff0c;右键&#xff0c;Git -------> Repository -…

人工智能:TensorFlow深度学习框架介绍

目录 1、TensorFlow简介 2、TensorFlow的主要任务 3. TensorFlow的特点 4、TensorFLow的缺点 5、TensorFlow的用途 6、实际案例 6.1 自动驾驶 6.2 安卓手机自拍功能 6.3 智能音箱 6.4智能医疗 今天给大家简单介绍一下TensorFlow深度学习框架&#xff0c;欢迎互相交流学习&#…

idea启动java服务报错OutOfMemoryError: GC overhead limit exceeded解决方法

在用idea开发java项目时&#xff0c;启动报内存溢出错误&#xff0c;致服务启动失败&#xff1a; Error:java: java.lang.OutOfMemoryError: GC overhead limit exceeded 报此错说明启动期间内存不够用了&#xff0c;把idea的启动进程堆内存值设大点就行了。 设置窗口&#x…