POJ3623 Best Cow Line, Gold 【后缀数组】
时间限制: 5000MS | 内存限制: 65536K | |
提交总数: 5917 | 接受: 2048 |
描述
FJ即将把他的ñ(1≤ ñ ≤30,000)头牛竞争一年一度的“年度农民”。在这个比赛中,每个农民都把他的牛排成一行,并把他们放在法官面前。
比赛组织者今年通过了一个新的注册方案:只要按照他们将要出现的顺序(即,如果FJ依次注册贝西,西尔维娅和多拉,他只注册BSD)登记每头牛的首字母。注册阶段结束后,按照奶牛姓名首字母的字符串,按增加的字典顺序对每个组进行判断。
FJ今年很忙,不得不赶回农场,所以他想尽早做出判断。他决定重新排列已经列队的牛,然后登记它们。
FJ标志着一个新的竞争奶牛的位置。然后,他通过反复将原始行(剩余部分)中的第一头或最后一头母牛发送到新行的末尾,将母牛从旧行进行编组到新行。当他完成之后,FJ就以这个新的顺序把他的奶牛注册了。
鉴于他的牛的初始秩序,确定他可以这样做的最小的字典串首字母缩写。
输入
*第1行:单个整数:N
*行2 .. N +1:第i + 1行包含原始行中第i个位置的牛的单个初始('A'..'Z')
产量
他能做的最少的字典串。每一行(可能除了最后一行)都包含新行的80头母牛('A'..'Z')的首字母缩写。
示例输入
6
一个
C
d
乙
C
乙
示例输出
ABCBCD
题意:每次从字符串首或尾拿出一个字符,求最小字典序方案
拿出字符字典序最小
①我们比较首尾,如果不同,肯定选最小那个
②如果相同,我们比较它的下一位,以此类推
由此,我们可以看出,其实左边的就是后缀,右边的就是将字符串反过来的后缀,二者进行比较
这就很简单了,我们将字符串翻转接到原字符串后边,用一个#之类的隔开,求一次后缀数组用rank贪心加入答案即可
【80个换一次行是什么蛇皮输出= =,没看到一直PE】
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long int
#define REP(i,n) for (int i = 1; i <= (n); i++)
#define REP0(i,n) for (int i = 0; i <= (n); i++)
#define PRE(i,n) for (int i = n; i >= 1; i--)
#define Redge(u) for (int k = head[u]; k != -1; k = edge[k].next)
using namespace std;
const int maxn = 60005,maxm = 100005,INF = 1000000000;
char s[maxn],ans[maxn];
int sa[maxn],rank[maxn],n,m,N,t1[maxn],t2[maxn],c[maxn];
void SA(){
int *x = t1,*y = t2;
REP0(i,m) c[i] = 0;
REP(i,n) c[x[i] = s[i]]++;
REP(i,m) c[i] += c[i - 1];
PRE(i,n) sa[c[x[i]]--] = i;
for (int k = 1; k <= n; k <<= 1){
int p = 0;
for (int i = n - k + 1; i <= n; i++) y[++p] = i;
REP(i,n) if (sa[i] - k > 0) y[++p] = sa[i] - k;
REP0(i,m) c[i] = 0;
REP(i,n) c[x[y[i]]]++;
REP(i,m) c[i] += c[i - 1];
PRE(i,n) sa[c[x[y[i]]]--] = y[i];
swap(x,y);
x[sa[1]] = p = 1;
for (int i = 2; i <= n; i++)
x[sa[i]] = y[sa[i]] == y[sa[i - 1]] && y[sa[i] + k] == y[sa[i - 1] + k] ? p : ++p;
if (p >= n) break;
m = p;
}
REP(i,n) rank[sa[i]] = i;
}
int main(){
cin>>N; m = 256; n = (N << 1) + 1;
REP(i,N){
s[i] = getchar();
while (!isalpha(s[i])) s[i] = getchar();
s[n + 1 - i] = s[i];
}
s[N + 1] = '#';
SA();
int L = 1,R = N,ansi = 0,r1,r2;
while (L < R){
r1 = rank[L]; r2 = rank[n + 1 - R];
ans[++ansi] = r1 < r2 ? s[L++] : s[R--];
}
ans[++ansi] = s[L];
REP(i,ansi){
putchar(ans[i]);
if (i % 80 == 0) puts("");
}
return 0;
}
POJ3623 Best Cow Line, Gold 【后缀数组】的更多相关文章
- POJ3623:Best Cow Line, Gold(后缀数组)
Description FJ is about to take his N (1 ≤ N ≤ 30,000) cows to the annual"Farmer of the Year&qu ...
- poj 3623 Best Cow Line, Gold 后缀数组 + 贪心
题目链接 题目描述 对于一个给定的字符串,可以从左右两端取字符,依次排列构成一个新的字符串. 求可能构成的字符串中字典序 最小的一个. 例:ACDBCB -> ABCBCD 思路 参考自 xue ...
- P2870 [USACO07DEC]最佳牛线,黄金Best Cow Line, Gold 解题报告
P2870 [USACO07DEC]最佳牛线,黄金Best Cow Line, Gold 题意 给一个字符串,每次可以从两边中的一边取一个字符,要求取出的字符串字典序最小 可以Hash+二分 也可以S ...
- P2870 [USACO07DEC]最佳牛线,黄金Best Cow Line, Gold
P2870 [USACO07DEC]最佳牛线,黄金Best Cow Line, Gold我比赛的时候A了,luogu上25分,QAQ,又憨又傻的200+代码,我为什么要干电脑干的事情,无语了.如果左边 ...
- 【POJ 3623】 Best Cow Line, Gold (后缀数组)
[题意] [分析] 后缀数组水题,嗯,不认真看输出像我一样就会被坑.. #include<cstdio> #include<cstdlib> #include<cstri ...
- [luoguP2870] [USACO07DEC]最佳牛线,黄金Best Cow Line, Gold(后缀数组)
传送门 数据小的话贪心就行. 可以把这个串翻转再接到后面,再求后缀数组,求出 rank 数组就很简单了. ——代码 #include <cstdio> #include <iostr ...
- 【poj3623】 Best Cow Line, Gold
http://poj.org/problem?id=3623 (题目链接) 题意 给出一个字符串,每次可以取首或尾接到一个新的字符串后面,求构出的字典序最小的新字符串. Solution 首先可以发现 ...
- poj 3623 Best Cow Line, Gold
题目不算难,但是不认真想的话很容易wa,我就是wa了多次才意识到自己想法存在的缺陷. 相同的时候往后找知道出现不相同时,只能判断出当前字符的优先顺序. 这个题目如果朴素的按照这种方法做的话复杂度其实是 ...
- [USACO 07DEC]Best Cow Line, Gold
Description 题库链接 给以长度为 \(n\) 的字符串,要求每次只能从两边取一个字符,使得取出来之后字典序最小. \(1\leq n\leq 30000\) Solution 将字符串翻转 ...
随机推荐
- what is feeding and what is 读扩散 and 写扩散?
what is feeding? 通俗点说feed系统就是当你登陆进对应网站后:微信朋友圈的动态.人人网上看到的一件件新鲜事.新浪微博上推到你面前的一条条新围脖等等.系统中的每一条消息就是一个feed ...
- Thinkphp5所有页面验证用户是否登陆
新建Base.php控制器,所有的页面继承自它 <?php namespace app\index\controller; use think\Controller; class Base ex ...
- Leecode刷题之旅-C语言/python-26.移除元素
/* * @lc app=leetcode.cn id=27 lang=c * * [27] 移除元素 * * https://leetcode-cn.com/problems/remove-elem ...
- [JSOI2007] 建筑抢修 (贪心 + 优先队列)
小刚在玩JSOI提供的一个称之为“建筑抢修”的电脑游戏:经过了一场激烈的战斗,T部落消灭了所有z部落的入侵者.但是T部落的基地里已经有N个建筑设施受到了严重的损伤,如果不尽快修复的话,这些建筑设施将会 ...
- ALVのイベントを取得する方法
概要 表示されたALVをダブルクリックした時に別画面へ遷移する方法を説明しよう.下記サンプルのように標準トランザクションへ遷移したり.別のALVを表示したりする事が可能である. サンプルコード ABA ...
- P1823 音乐会的等待(单调栈)
P1823 音乐会的等待 题目描述 N个人正在排队进入一个音乐会.人们等得很无聊,于是他们开始转来转去,想在队伍里寻找自己的熟人.队列中任意两个人A和B,如果他们是相邻或他们之间没有人比A或B高,那么 ...
- 剖析DI
0x00.前言 当我们研究一些晦涩的源码,上网查阅资料的时候,映入眼帘的总有这么些名词:DIP.IOC.DI.DL.IOC容器这些专业名词.如果不懂这些名词背后的含义,我们内心有可能是这样的: 0x0 ...
- error LNK2001: unresolved external symbol "public: __thiscall ControllerInterface::ControllerInterface(class QObject *)" (??0ControllerInterface@@QAE@PAVQObject@@@Z) downloadcontroller.obj
前几天刚遇到这个问题,但是今天再碰到就又要思考怎么解决.这次特别记录一下,以防下次碰到再手足无措: 1.看到这个报错第一感觉LNK关键字,表示连接错误,这种错误有几个可以下手的点 1)函数声明和定义是 ...
- java集合浅谈(一)
一.类库结构图概览 容器对象仅能持有对象引用(对象的指针),而不是Copy对象信息,从网上搜得几张Java中集合类库的结构图,如下所示: 二.解说Collection 2.1 Collection ( ...
- 学习人工智能的第六个月[深度学习[Deep Learning,DL]]
这个月阅读了论文[Partial Adversarial Domain Adaptation-eccv18],文章着眼于源域标签空间包含目标域标签空间的场景,在域对抗神经网络的基础上提出了部分对抗域适 ...