bzoj1692 [Usaco2007 Dec]队列变换
题目链接
一开始还想用o(n)贪心……想多了……
后缀数组预处理之后通过比较rank来确定取前面的或者后面的
调了半天发现c[]开小了QAQ
1 #include<algorithm> 2 #include<iostream> 3 #include<cstdlib> 4 #include<cstring> 5 #include<cstdio> 6 #include<string> 7 #include<cmath> 8 #include<ctime> 9 #include<queue> 10 #include<stack> 11 #include<map> 12 #include<set> 13 #define rre(i,r,l) for(int i=(r);i>=(l);i--) 14 #define re(i,l,r) for(int i=(l);i<=(r);i++) 15 #define Clear(a,b) memset(a,b,sizeof(a)) 16 #define inout(x) printf("%d",(x)) 17 #define douin(x) scanf("%lf",&x) 18 #define strin(x) scanf("%s",(x)) 19 #define LLin(x) scanf("%lld",&x) 20 #define op operator 21 #define CSC main 22 typedef unsigned long long ULL; 23 typedef const int cint; 24 typedef long long LL; 25 using namespace std; 26 void inin(int &ret) 27 { 28 ret=0;int f=0;char ch=getchar(); 29 while(ch<'0'||ch>'9'){if(ch=='-')f=1;ch=getchar();} 30 while(ch>='0'&&ch<='9')ret*=10,ret+=ch-'0',ch=getchar(); 31 ret=f?-ret:ret; 32 } 33 int sa[70030],c[70111],t[70030],t2[70030],rank[70030]; 34 char s[70030]; 35 void build_sa(int m) 36 { 37 int *x=t,*y=t2,n=strlen(s),p=0; 38 re(i,0,m-1)c[i]=0; 39 re(i,0,n-1)c[x[i]=s[i]]++; 40 re(i,1,m-1)c[i]+=c[i-1]; 41 rre(i,n-1,0)sa[--c[x[i]]]=i; 42 for(int k=1;k<=n;k<<=1) 43 { 44 p=0; 45 rre(i,n-1,n-k)y[p++]=i; 46 re(i,0,n-1)if(sa[i]>=k)y[p++]=sa[i]-k; 47 re(i,0,m-1)c[i]=0; 48 re(i,0,n-1)c[x[y[i]]]++; 49 re(i,1,m-1)c[i]+=c[i-1]; 50 rre(i,n-1,0)sa[--c[x[y[i]]]]=y[i]; 51 swap(x,y); 52 x[sa[0]]=0,p=1; 53 re(i,1,n-1) 54 x[sa[i]]=y[sa[i]]==y[sa[i-1]]&&y[sa[i]+k]==y[sa[i-1]+k]?p-1:p++; 55 if(p>=n)break; 56 m=p; 57 } 58 } 59 int n; 60 int main() 61 { 62 freopen("in.in","r",stdin); 63 freopen("out.out","w",stdout); 64 scanf("%d",&n); 65 re(i,0,n-1) 66 { 67 getchar(); 68 s[i]=getchar(); 69 } 70 s[n]='Z'+1; 71 re(i,0,n-1)s[(n<<1)-i]=s[i]; 72 build_sa(1000); 73 re(i,0,n<<1)rank[sa[i]]=i; 74 int l=0,r=n-1; 75 for(int tot=0;tot<n&&l<r;tot++) 76 { 77 if(tot&&tot%80==0)cout<<"\n"; 78 if(rank[l]<rank[(n<<1)-r])printf("%c",s[l++]); 79 else printf("%c",s[(n<<1)-(r--)]); 80 } 81 printf("%c",s[l]); 82 return 0; 83 }
转载于:https://www.cnblogs.com/HugeGun/p/5224239.html
bzoj1692 [Usaco2007 Dec]队列变换相关推荐
- BZOJ 1692: [Usaco2007 Dec]队列变换( 贪心 )
数据 n <= 30000 , 然后 O( n² ) 的贪心也过了..... USACO 数据是有多弱啊 = = ( ps : BZOJ 1640 和此题一模一样 , 双倍经验 ) ------ ...
- bzoj 1640 bzoj 1692: [Usaco2007 Dec]队列变换(后缀数组)
1692: [Usaco2007 Dec]队列变换 Time Limit: 5 Sec Memory Limit: 64 MB Submit: 1756 Solved: 737 [Submit][ ...
- bzoj:1692 [Usaco2007 Dec]队列变换1640 [Usaco2007 Nov]Best Cow Line 队列变换
Description FJ打算带他的N(1 <= N <= 30,000)头奶牛去参加一年一度的"全美农场主大奖赛".在这场比赛中,每个参赛者都必须让他的奶牛排成一列 ...
- 【BZOJ】1692: [Usaco2007 Dec]队列变换
[算法]字符串hash [题解] 显然如果字母互不相同,贪心取是正确的. 如果存在字母相同,那么就换成比较后缀和前缀嘛. 但是要注意,不是后缀和前缀相同就能直接跳跃,每次必须只推一位. 取模的哈希比自 ...
- bzoj4278[ONTAK2015]Tasowanie bzoj1692[USACO 2007Dec]队列变换(Best Cow Line) 贪心正确性证明...
做法网上到处都有就不说了. 这题其实是之前做的-.不过由于人太傻现在才想明白比较字典序进行贪心的正确性-. 方便起见,在两个串的最右端都加上很大但不相同的字符,避免第lcp+1个字符不存在的边界. 如 ...
- BZOJ 1691: [Usaco2007 Dec]挑剔的美食家( 平衡树 )
按鲜嫩程度排个序, 从大到小处理, 用平衡树维护价值 ---------------------------------------------------------------------- #i ...
- [BZOJ1626][Usaco2007 Dec]Building Roads 修建道路
1626: [Usaco2007 Dec]Building Roads 修建道路 Time Limit: 5 Sec Memory Limit: 64 MB Submit: 1730 Solved ...
- bzoj1625[Usaco2007 Dec]宝石手镯*
bzoj1625[Usaco2007 Dec]宝石手镯 题意: n个宝石,每个有重量和价值,要挂一些在手镯上,求满足总质量不超过m的最大总价值.n≤3402,m≤12880 题解: 01背包. 代码: ...
- bzoj 1691: [Usaco2007 Dec]挑剔的美食家(multiset贪心)
1691: [Usaco2007 Dec]挑剔的美食家 Time Limit: 5 Sec Memory Limit: 64 MB Submit: 879 Solved: 445 [Submit] ...
- bzoj 1627: [Usaco2007 Dec]穿越泥地(BFS)
1627: [Usaco2007 Dec]穿越泥地 Time Limit: 5 Sec Memory Limit: 64 MB Submit: 768 Solved: 517 [Submit][S ...
最新文章
- CentOS7安装Composer
- H3C——BGP联盟配置
- C# task和timer实现定时操作
- AJAX应用和传统Web应用有什么不同
- python怎么存储数据_Python:如何在类中存储数据并继承
- oracle 收集统计信息会锁表吗,统计信息锁住导致收集统计信息失败引起sql执行异常...
- 使用ztree展示树形菜单结构
- 深入理解Java中间件Zookeeper
- java 快逸报表_数据填报 | 快逸报表工具-Java报表软件
- unity图片导入尺寸改变了修改方法
- java中求数组中最大值
- 全球 40 位 40 岁以下的富豪
- 网易严选打造数仓规范和评价体系实践
- 服务器虚拟化书籍,服务器虚拟化解决方案书模板-精选版.doc
- 斯坦福大学开放课程:编程方法.02/第二课练习:karel 跳墙
- python用bbp公式计算圆周率_利用BBP公式来计算Pi圆周率的PHP代码
- persona chat
- 基于AT89C51/52和DS18B20的温度传感器设计报告(后附代码)
- 蓝桥杯单片机比赛学习:11、频率测量的基本原理
- 安装mysql8.0 https://dl.bintray.com/ 网址被禁用问题
热门文章
- 解决TortoiseGit文件夹和文件状态图标不显示问题
- 祝贺吾博文中第一篇点击超过一万的文章出现
- ajax异步加载页面元素,使用jQuery的AJAX封装函数load()异步加载多个页面的相同页头/页尾(注意:js无法操作动态生成的网页元素)...
- db2 replace函数的用法_C++常用函数整理
- linux centos git 自动更新,在centos上搭建git服务器并自动同步代码
- python 元编程有多强_马克的Python学习笔记#元编程 3
- C# lable及时显示 lable实时刷新
- C++11 外部模板
- js修改mysql数据库数据_Node.js操作mysql数据库增删改查_node.js
- 苹果公司的企业文化_标志设计对于企业的重要性,性价比高的标志设计公司分享...