题目链接

一开始还想用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]队列变换相关推荐

  1. BZOJ 1692: [Usaco2007 Dec]队列变换( 贪心 )

    数据 n <= 30000 , 然后 O( n² ) 的贪心也过了..... USACO 数据是有多弱啊 = = ( ps : BZOJ 1640 和此题一模一样 , 双倍经验 ) ------ ...

  2. bzoj 1640 bzoj 1692: [Usaco2007 Dec]队列变换(后缀数组)

    1692: [Usaco2007 Dec]队列变换 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 1756  Solved: 737 [Submit][ ...

  3. bzoj:1692 [Usaco2007 Dec]队列变换1640 [Usaco2007 Nov]Best Cow Line 队列变换

    Description FJ打算带他的N(1 <= N <= 30,000)头奶牛去参加一年一度的"全美农场主大奖赛".在这场比赛中,每个参赛者都必须让他的奶牛排成一列 ...

  4. 【BZOJ】1692: [Usaco2007 Dec]队列变换

    [算法]字符串hash [题解] 显然如果字母互不相同,贪心取是正确的. 如果存在字母相同,那么就换成比较后缀和前缀嘛. 但是要注意,不是后缀和前缀相同就能直接跳跃,每次必须只推一位. 取模的哈希比自 ...

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

    做法网上到处都有就不说了. 这题其实是之前做的-.不过由于人太傻现在才想明白比较字典序进行贪心的正确性-. 方便起见,在两个串的最右端都加上很大但不相同的字符,避免第lcp+1个字符不存在的边界. 如 ...

  6. BZOJ 1691: [Usaco2007 Dec]挑剔的美食家( 平衡树 )

    按鲜嫩程度排个序, 从大到小处理, 用平衡树维护价值 ---------------------------------------------------------------------- #i ...

  7. [BZOJ1626][Usaco2007 Dec]Building Roads 修建道路

    1626: [Usaco2007 Dec]Building Roads 修建道路 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 1730  Solved ...

  8. bzoj1625[Usaco2007 Dec]宝石手镯*

    bzoj1625[Usaco2007 Dec]宝石手镯 题意: n个宝石,每个有重量和价值,要挂一些在手镯上,求满足总质量不超过m的最大总价值.n≤3402,m≤12880 题解: 01背包. 代码: ...

  9. bzoj 1691: [Usaco2007 Dec]挑剔的美食家(multiset贪心)

    1691: [Usaco2007 Dec]挑剔的美食家 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 879  Solved: 445 [Submit] ...

  10. bzoj 1627: [Usaco2007 Dec]穿越泥地(BFS)

    1627: [Usaco2007 Dec]穿越泥地 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 768  Solved: 517 [Submit][S ...

最新文章

  1. CentOS7安装Composer
  2. H3C——BGP联盟配置
  3. C# task和timer实现定时操作
  4. AJAX应用和传统Web应用有什么不同
  5. python怎么存储数据_Python:如何在类中存储数据并继承
  6. oracle 收集统计信息会锁表吗,统计信息锁住导致收集统计信息失败引起sql执行异常...
  7. 使用ztree展示树形菜单结构
  8. 深入理解Java中间件Zookeeper
  9. java 快逸报表_数据填报 | 快逸报表工具-Java报表软件
  10. unity图片导入尺寸改变了修改方法
  11. java中求数组中最大值
  12. 全球 40 位 40 岁以下的富豪
  13. 网易严选打造数仓规范和评价体系实践
  14. 服务器虚拟化书籍,服务器虚拟化解决方案书模板-精选版.doc
  15. 斯坦福大学开放课程:编程方法.02/第二课练习:karel 跳墙
  16. python用bbp公式计算圆周率_利用BBP公式来计算Pi圆周率的PHP代码
  17. persona chat
  18. 基于AT89C51/52和DS18B20的温度传感器设计报告(后附代码)
  19. 蓝桥杯单片机比赛学习:11、频率测量的基本原理
  20. 安装mysql8.0 https://dl.bintray.com/ 网址被禁用问题

热门文章

  1. 解决TortoiseGit文件夹和文件状态图标不显示问题
  2. 祝贺吾博文中第一篇点击超过一万的文章出现
  3. ajax异步加载页面元素,使用jQuery的AJAX封装函数load()异步加载多个页面的相同页头/页尾(注意:js无法操作动态生成的网页元素)...
  4. db2 replace函数的用法_C++常用函数整理
  5. linux centos git 自动更新,在centos上搭建git服务器并自动同步代码
  6. python 元编程有多强_马克的Python学习笔记#元编程 3
  7. C# lable及时显示 lable实时刷新
  8. C++11 外部模板
  9. js修改mysql数据库数据_Node.js操作mysql数据库增删改查_node.js
  10. 苹果公司的企业文化_标志设计对于企业的重要性,性价比高的标志设计公司分享...