[USACO 07DEC]Best Cow Line, Gold
Description
给以长度为 \(n\) 的字符串,要求每次只能从两边取一个字符,使得取出来之后字典序最小。
\(1\leq n\leq 30000\)
Solution
将字符串翻转后加在原字符串后,求个后缀排名。直接比较排名来判断取前还是取后。
Code
#include <bits/stdc++.h>
using namespace std;
const int N = (30000+5)<<1;
char ch[N];
int n, m, x[N<<1], y[N<<1], c[N], sa[N], rk[N];
void get() {
    for (int i = 1; i <= n; i++) c[x[i] = ch[i]]++;
    for (int i = 2; i <= m; i++) c[i] += c[i-1];
    for (int i = n; i >= 1; i--) sa[c[x[i]]--] = i;
    for (int k = 1; k <= n; k <<= 1) {
        int num = 0;
        for (int i = n-k+1; i <= n; i++) y[++num] = i;
        for (int i = 1; i <= n; i++) if (sa[i] > k) y[++num] = sa[i]-k;
        for (int i = 1; i <= m; i++) c[i] = 0;
        for (int i = 1; i <= n; i++) c[x[i]]++;
        for (int i = 2; i <= m; i++) c[i] += c[i-1];
        for (int i = n; i >= 1; i--) sa[c[x[y[i]]]--] = y[i];
        swap(x, y); x[sa[1]] = num = 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]) ? num : ++num;
        if ((m = num) == n) break;
    }
    for (int i = 1; i <= n; i++) rk[sa[i]] = i;
}
void work() {
    scanf("%d", &n); getchar();
    for (int i = 1; i <= n; i++) {
        scanf("%c", &ch[i]); getchar();
        ch[(n<<1)+2-i] = ch[i];
    }
    ch[n+1] = '$'; n = (n<<1)+1; m = 100;
    get();
    for (int i = 1, lm = (n>>1), l = 1, r = lm; i <= lm; i++) {
        if (rk[l] <= rk[n-r+1]) putchar(ch[l++]);
        else putchar(ch[r--]);
        if (i%80 == 0) puts("");
    }
}
int main() {work(); return 0; }												
											[USACO 07DEC]Best Cow Line, Gold的更多相关文章
- P2870 [USACO07DEC]最佳牛线,黄金Best Cow Line, Gold
		
P2870 [USACO07DEC]最佳牛线,黄金Best Cow Line, Gold我比赛的时候A了,luogu上25分,QAQ,又憨又傻的200+代码,我为什么要干电脑干的事情,无语了.如果左边 ...
 - P2870 [USACO07DEC]最佳牛线,黄金Best Cow Line, Gold 解题报告
		
P2870 [USACO07DEC]最佳牛线,黄金Best Cow Line, Gold 题意 给一个字符串,每次可以从两边中的一边取一个字符,要求取出的字符串字典序最小 可以Hash+二分 也可以S ...
 - USACO 2009 Open Cow Line /// 队列 oj26220
		
题目大意: 输入n,n次操作 操作A:在L(左边)或R(右边)插入一个递增的数 操作D:在L(左边)或R(右边)删除m个数 Sample Input 10A LA LA RA LD R 2A RA R ...
 - 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 ...
 - HDU 3623 Best Cow Line, Gold(模拟,注意思路,简单)
		
题目 POJ 3617 和 这道题题目一样,只是范围稍稍再小一点. //模拟试试 #include<stdio.h> #include<string.h> #include&l ...
 - 【POJ 3623】 Best Cow Line, Gold (后缀数组)
		
[题意] [分析] 后缀数组水题,嗯,不认真看输出像我一样就会被坑.. #include<cstdio> #include<cstdlib> #include<cstri ...
 - POJ 3623	 Best Cow Line, Gold(字符串处理)
		
题意:给你一个字符串,让你重新排列,只能从头或者尾部取出一个放到新字符串队列的最后.按照字典序. 解决方法:比较前后两个的大小,谁小输出谁,相等,就往当中比来确定当前应该拿最前面的还是最后面的,如果再 ...
 - poj 3623 Best Cow Line, Gold
		
题目不算难,但是不认真想的话很容易wa,我就是wa了多次才意识到自己想法存在的缺陷. 相同的时候往后找知道出现不相同时,只能判断出当前字符的优先顺序. 这个题目如果朴素的按照这种方法做的话复杂度其实是 ...
 - 【poj3623】 Best Cow Line, Gold
		
http://poj.org/problem?id=3623 (题目链接) 题意 给出一个字符串,每次可以取首或尾接到一个新的字符串后面,求构出的字典序最小的新字符串. Solution 首先可以发现 ...
 
随机推荐
- [device-orientation] 使用手机设备的方向感应实现图片选择
			
<div class="main"> <h2>Device Orientation</h2> <table> <tbody&g ...
 - unigui 设置单元格颜色
			
procedure TF_Resource2.UniDBGrid1DrawColumnCell(Sender: TObject; ACol, ARow: Integer; Column: TUniD ...
 - WinAPI: sndPlaySound - 播放 wav 文件
			
WinAPI: sndPlaySound - 播放 wav 文件 //声明: sndPlaySound( lpszSoundName: PChar; {声音文件} uFlags: UINT{播 ...
 - 使用LINQ、Lambda 表达式 、委托快速比较两个集合,找出需要新增、修改、删除的对象
			
本文需要对C#里的LINQ.Lambda 表达式 .委托有一定了解. 在工作中,经常遇到需要对比两个集合的场景,如: 页面集合数据修改,需要保存到数据库 全量同步上游数据到本系统数据库 在这些场景中, ...
 - 为什么要使用Entity Framework
			
本文介绍从DDD(Domain-Driven Design[领域驱动设计])的角度来说说为什么要使用Entity Framework(以下都会简称为EF),同时也看出类似Drapper之类的简陋ORM ...
 - appium精简教程
			
环境配置 package appium; import io.appium.java_client.android.*; import java.io.File; import java.io.IOE ...
 - 「PKUSC2018」主斗地(暴搜)
			
这道斗地主比 \(PKUWC\) 那道可做多了... 我们用 \(NOIP\) 那道斗地主的思路:暴搜出三代和四代,贪心出散牌. 还有jry为什么要出xx网友而不出他的另一个老婆 我们发现两个人的每回 ...
 - [HTML] css3 输入框input类型为number时,去掉上下箭头方式
			
<input type="number" ...> <style> input::-webkit-outer-spin-button, input::-we ...
 - odoo 开发基础 -- postgresql重新启动、状态查看
			
场景描述: 当遇到数据库不能正常访问的时候,我们首先想到的是,查看相关的告警日志,一般先查看系统的日志,然后查看数据库的日志,Linux平台下,postgresql的日志文件存放目录在如下路径: te ...
 - Java抽象类应用—模板方法模式
			
模板方法模式(Templete method) 定义一个操作中的算法的骨架,而将一些可变部分的实现延迟到子类中,模板方法模式使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定的步骤. 例: ...