注意输出是80字符个一行!!

首先贪心很显然,就是两头尽量拿小的。

然后需要处理两头一样的情况,显然是选字典序小的一串,把数组反着接在原数组后面,然后跑sa,判断的时候直接比较rk数组

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=300005;
int n,sa[N],wa[N],wb[N],wv[N],wsu[N],rk[N];
char c[N],s[N],ch[10];
bool cmp(int *r,int a,int b,int l)
{
return r[a]==r[b]&&r[a+l]==r[b+l];
}
void saa(char *r,int n,int m)
{
int *x=wa,*y=wb;
for(int i=0;i<m;i++)
wsu[i]=0;
for(int i=0;i<n;i++)
wsu[x[i]=r[i]]++;
for(int i=1;i<m;i++)
wsu[i]+=wsu[i-1];
for(int i=n-1;i>=0;i--)
sa[--wsu[x[i]]]=i;
for(int j=1,p=1;j<=n&&p<=n;j<<=1,m=p)
{
p=0;
for(int i=n-j;i<n;i++)
y[p++]=i;
for(int i=0;i<n;i++)
if(sa[i]>=j)
y[p++]=sa[i]-j;
for(int i=0;i<n;i++)
wv[i]=x[y[i]];
for(int i=0;i<m;i++)
wsu[i]=0;
for(int i=0;i<n;i++)
wsu[wv[i]]++;
for(int i=1;i<m;i++)
wsu[i]+=wsu[i-1];
for(int i=n-1;i>=0;i--)
sa[--wsu[wv[i]]]=y[i];
swap(x,y);
x[sa[0]]=0;
p=1;
for(int i=1;i<n;i++)
x[sa[i]]=cmp(y,sa[i-1],sa[i],j)?p-1:p++;
}
for(int i=0;i<n;i++)
rk[sa[i]]=i;
}
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%s",ch);
c[n+n-i]=c[i]=ch[0];
}
c[n]='a'-1;
saa(c,2*n+1,200);
int l=0,r=n+1;
for(int i=0;i<n;i++)
{
if(rk[l]<rk[r])
putchar(c[l++]);
else
putchar(c[r++]);
if(!((i+1)%80))
putchar('\n');
}
return 0;
}
/*
6
A
C
D
B
C
B
*/

bzoj 1640||1692: [Usaco2007 Dec]队列变换【后缀数组】的更多相关文章

  1. BZOJ 1692: [Usaco2007 Dec]队列变换 [后缀数组 贪心]

    1692: [Usaco2007 Dec]队列变换 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1383  Solved: 582[Submit][St ...

  2. BZOJ 1692: [Usaco2007 Dec]队列变换 (后缀数组/二分+Hash)

    跟BZOJ 4278: [ONTAK2015]Tasowanie一模一样 SA的做法就是把原串倒过来接在原串后面,O(nlogn)O(nlogn)O(nlogn)做后缀数组,就能O(1)O(1)O(1 ...

  3. 1692: [Usaco2007 Dec]队列变换|后缀数组|贪心

    将字符串翻转后接到原串的后面,中间加一个分隔符,每次都贪心选择rankrank小的那个 事实上就是练习一发后缀数组的模板 #include<algorithm> #include<i ...

  4. 【BZOJ1692】[Usaco2007 Dec]队列变换 后缀数组+贪心

    [BZOJ1692][Usaco2007 Dec]队列变换 Description FJ打算带他的N(1 <= N <= 30,000)头奶牛去参加一年一度的“全美农场主大奖赛”.在这场比 ...

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

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

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

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

  7. 1692: [Usaco2007 Dec]队列变换(BZOJ1640强化版)

    1692: [Usaco2007 Dec]队列变换 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 682  Solved: 280[Submit][Sta ...

  8. [BZOJ 1692] [Usaco2007 Dec] 队列变换 【后缀数组 + 贪心】

    ---恢复内容开始--- 题目链接:BZOJ - 1692 题目分析 首先,有个比较简单的贪心思路:如果当前剩余字符串的两端字母不同,就选取小的字母,这样显然是正确的. 然而若两端字母相同,我们怎么选 ...

  9. ●BZOJ 1692 [Usaco2007 Dec]队列变换

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=1692 题解: 后缀数组,贪心由于每次可以取出旧队列的首部或尾部放在新队列的尾部.所以就需要比 ...

随机推荐

  1. poj2689素数问题

    打算重新刷一下数论题,忘了很多了,水平也很差,此题入手就不顺了,刷了一个早上,只是一个简单 的素数应用罢了.题意:找出区间长度不超过10^6的最近的素数和最远的素数(相邻的), 算法:数在int范围内 ...

  2. hdu 4819 Mosaic

    无论是线段树还是树状数组维护最大值最小值的时候一定要注意,如果有修改操作的话,这个最小值和最大值的更新一定不能由原来的和修改的值得到,一定要重新查询一次,否则可能出现当前最小值是原来的未修改值,但事实 ...

  3. NodeJS+MongoDB+AngularJS+Bootstrap书店示例

    目录 一.Bootstrap 1.1.添加引用 1.2.在页面中使用BootStrap 1.3.可视化布局 二.使用MongoDB创建数据库 2.1.启动MongoDB数据库 2.2.启动数据库GUI ...

  4. iOS: 解决Asset Catalog Compile Error - TDDIstiller instance can only be distilled only one time的错误

    执行命令:rm -rf /Users/<用户名>/Library/Developer/Xcode/DerivedData 然后重新编译项目即可.

  5. topcoder srm 551

    div1 250pt 题意:一个长度最多50的字符串,每次操作可以交换相邻的两个字符,问,经过最多MaxSwaps次交换之后,最多能让多少个相同的字符连起来 解法:对于每种字符,枚举一个“集结点”,让 ...

  6. Linux 将一般的用户加入sudo组is_not_in_the_sudoers_file._This_incident_will_be_reported解决方法

      在一般用户下执行sudo命令提示xxx is not in the sudoers file. This incident will be reported.解决方法:        $where ...

  7. Tomcat-公布WEB应用

    1.定义Context 进入管理WEB应用的URL是http://localhost:8080/manager/html. username与password的设置:打开tomcat安装文件夹中的co ...

  8. 编写高质量代码:改善C#程序的157个建议

    目录 前 言第一部分 语言篇第1章 基本语言要素 / 2建议1:正确操作字符串 / 2建议2:使用默认转型方法 / 6建议3:区别对待强制转型与as和is / 9建议4:TryParse比Parse好 ...

  9. 在类的头文件里尽量少引入其它头文件 &lt;&lt;Effective Objective-C&gt;&gt;

    与C 和C++ 一样,Objective-C 也使用"头文件"(header file) 与"实现文件"(implementation file)来区隔代码.用 ...

  10. 数据库建表参考(SQL Server)

      (1).字段设置为Not Null+Default Value.原因:减少三值判断,可为Null的字段要多判断null:另外,定长字段为null也占空间,变长字段为空字符串也是不占空间,所以设置成 ...