【POJ1509】Glass Beads
【POJ1509】Glass Beads
【题目描述】给定字符串S,并规定首尾相连成环,求出最小字典序。
【输入】输入有多个数据,第一行只包括正整数N,表示有N组数据。每个数据包括一行,输入该字符串。
【输出】对于每个数据,输出一行数据表示从哪一个字母开始为最小字典序排列。
【题解思路】暴力是个好东西,咳咳咳
该题为赤果果的最小表示。
Q:最小表示是什么?
A:看题目描述撒。
Q:怎么个表示法呢?
A:莫急,往下看哈。
- 还是从暴力开始讲:依次比较n个以不同位置字符开头的字符串,找到其中字典序最小的那一个。复杂度…貌似是O(n^3)的吧。
- 考虑暴力比较时的过程:设以i开头的字符串串为A[i],比较A[i+k]与A[j+k](0<=k<=n)是否相等,找到不相等的地方,判断该位置上的元素哪个字典序大那么以该序列开头的串串整体字典序就比较大。
- 再次考虑刚刚的暴力过程。如果我们发现i+k与j+k不相等,不妨设是i+k处字典序大于j+k处字典序,那么A[i]肯定不是最小表示。其次,对于A[i+p]和A[j+p], A[j+p]始终会比A[i+p]更优。因为两个串串进行比较会在p = k时不等,而i+k处的字典序又大于j+k处的,A[j+p]的字典序总是小于A[i+p]。那么当我们能判断一组这样的关系时,满足编号差为相同值的任意两个串都满足同样的关系。
- 具体思路:
(1) 从i = 1,j = 2开始往后扫描,若扫描了n个字符串之后仍然相等,说明S只由1种字符构成,那么输出数字1即可;
(2) 若在i+k与j+k处发现不等,若A[i+k]>A[j+k],令i = i+k+1。若此时i = j,再令i = i+1。若A[i+k]<A[j+k],令j = j+k+1。若此时i = j,再令j = j+1;
(3) 扫描完之后,若i>n,A[j]为最小表示,若j>n,A[i]为最小表示。
该算法时间复杂度为O(n)。
#include<iostream>
#include<string.h>
#include<cstdio>
const int maxs = 1e4+;
using namespace std;
int n,ans;
char s[maxs*];
int main(){
scanf("%d",&n);
while(n--){
scanf("%s",s+);
int lens = strlen(s+);
for(int i = ;i <= lens; ++i) s[lens+i] = s[i];
int i = ,j = ,k;
while(i <= lens && j <= lens){
for(k = ;k <= lens && s[i+k]==s[j+k]; k++);
if(k >= lens) break;
if(s[i+k] > s[j+k]){
i = i+k+;
if(i == j) i++;
} else{
j = j+k+;
if(i == j) j++;
}
}
ans = min(i,j);
printf("%d\n",ans);
}
return ;
}
【POJ1509】Glass Beads的更多相关文章
- 【POJ1509】Glass Beads 【后缀自动机】
题意 给出一个字符串,求它的最小表示法. 分析 这个题当然可以用最小表示法做啦!但是我是为了学后缀自动机鸭! 我们把这个字符串长度乘二,然后建SAM,然后在SAM上每次跑最小的那个字母,找出长度为n的 ...
- 【CF527C】Glass Carving
[CF527C]Glass Carving 题面 洛谷 题解 因为横着切与纵切无关 所以开\(set\)维护横着的最大值和纵着的最大值即可 #include <iostream> #inc ...
- 【BZOJ2081】[Poi2010]Beads hash+调和级数
[BZOJ2081][Poi2010]Beads Description Zxl有一次决定制造一条项链,她以非常便宜的价格买了一长条鲜艳的珊瑚珠子,她现在也有一个机器,能把这条珠子切成很多块(子串), ...
- 【SAM】POJ1509-Glass Beads
[题目大意] 求一个循环数列的最小表示法. [思路] 把原创复制一遍放在后面,建立SAM,从s按字典序开始跑长度L即可. 板子来源(作者见连接内):
- 【bzoj2081】[Poi2010]Beads Hash
题目描述 Zxl有一次决定制造一条项链,她以非常便宜的价格买了一长条鲜艳的珊瑚珠子,她现在也有一个机器,能把这条珠子切成很多块(子串),每块有k(k>0)个珠子,如果这条珠子的长度不是k的倍数, ...
- POJ1509 Glass Beads
Glass Beads Time Limit: 3000MS Memory Limit: 10000K Total Submissions: 4314 Accepted: 2448 Descr ...
- POJ1509 Glass Beads(最小表示法 后缀自动机)
Time Limit: 3000MS Memory Limit: 10000K Total Submissions: 4901 Accepted: 2765 Description Once ...
- 【codeforces 527C】Glass Carving
[题目链接]:http://codeforces.com/contest/527/problem/C [题意] 让你切割一个长方形; 只能横切或竖切; 让你实时输出切完之后最大的长方形的面积; [题解 ...
- cogs 2123. [HZOI 2015] Glass Beads
2123. [HZOI 2015] Glass Beads ★★★ 输入文件:MinRepresentations.in 输出文件:MinRepresentations.out 简单对比时 ...
随机推荐
- Python记录4:文件操作
###文件 ''' 1. 什麽是文件 文件是操作系統為用戶/应用程序提供一種操作硬盤的虚拟单位 2. 爲何要用文件 为了存取硬盘数据 3. 如何用文件 #1. 打開文件 #2. 读写文 ...
- Abp项目构建、swagger及代码生成器
前段时间在学习abp,在配置swagger时踩了不少坑,特此整理一下,方便同行参考.幸运的是又发现了神奇的代码生成器,分享下亲身经验. 觉得此博客非常有用的朋友可以在右侧赞助打赏下,非常感谢大家支持. ...
- leetcode Sort List 对链表进行排序
描述: Sort a linked list in O(n log n) time using constant space complexity. 在O(n*log(n))的时间复杂度,常数级空间复 ...
- report源码分析——report_handle和report_server和report_catcher
report_handle主要实现对message的action,severity,file的设置,然后将message传递给server: 主要的function有两个:initial和proces ...
- python base64加密文本内容(1)
仅仅使用base64加密安全系数太低了,我们还可以自定义base64加密后的文本进行一些变化,提高安全系数,在解密时再回复某些变化 1,先实现一个base64加密 import base64 impo ...
- uva 1632 Alibaba
题意: 一个人要从如果干个地方拿货,每个地方的货物是有存在时间的,到了某个时间之后就会消失. 按照位置从左到右给出货物的位置以及生存时间,这个人选择一个最优的位置出发,问拿完货物的最少时间. 思路: ...
- VPS高性能虚拟机KVM详解
1. KVM 介绍 1.0 虚拟化简史 其中,KVM 全称是 基于内核的虚拟机(Kernel-based Virtual Machine),它是Linux 的一个内核模块,该内核模块使得 Linux ...
- Codeforce 835A - Key races
Two boys decided to compete in text typing on the site "Key races". During the competition ...
- Pytorch-学习记录 卷积操作 cnn output_channel, etc.
参考资料: pytorch中文文档 http://pytorch-cn.readthedocs.io/zh/latest/
- mycat->oracle报java.sql.SQLException: 无法从套接字读取更多的数据
今天下午,测试环境清算的时候又出现了之前的一个异常,这次把错误信息全部打出来了,java.sql.SQLException: 无法从套接字读取更多的数据,是使用mycat连接oracle的,如下所示: ...