【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 简单对比时 ...
随机推荐
- 第一章 JS基础
1.JavaScript的作用:表单验证,减轻服务器压力动态效果动态改变页面内容 2.JavaScript的组成ECMAScript语法规定BOM对象模型(浏览器对象模型)DOM对象模型(文档对象模型 ...
- 【AngularJS】解决ng-if中的ng-model值无效的问题(转)
from:http://blog.csdn.net/u013451157/article/details/60866210 与其他指令一样,ng-if指令也会创建一个子级作用域,因此,如果在ng-if ...
- PE结构图示
- 学习笔记<4>初步控件布局
一.控件布局基本概念 指控制控件在Activity当中的位置.大小.颜色以及其他控件样式属性 二.控件布局两种方法 1.使用布局文件完成控件布局(eclipse可视化拖拽控件实现) 2.在JAVA代码 ...
- 14. Longest Common Prefix(暴力循环)
Write a function to find the longest common prefix string amongst an array of strings. If there is n ...
- django之视图view小知识
CBV简版流程 AddPublisher.as_view() ——> view 函数 当请求来的时候才执行view view中执行: 1. 先实例化AddPublisher,给self def ...
- linux常用命令:pwd 命令
Linux中用 pwd 命令来查看”当前工作目录“的完整路径. 简单得说,每当你在终端进行操作时,你都会有一个当前工作目录.在不太确定当前位置时,就会使用pwd来判定当前目录在文件系统内的确切位置. ...
- 阿里巴巴 Java 代码规范
1. 抽象类命名使用 Abstratc开头. 2. 阿里强制规定不允许任何魔法值(未经定义的常量)直接出现在代码中.魔法值会让代码的可读性大大降低,而且如果同样的数值多次出现时,容易出现不清楚这些数值 ...
- window下nodejs用nodemon启动koa2项目(用cmd启动不了,要用Git Bash Here 启动才可以)
window下nodejs用nodemon启动koa2项目(用cmd启动不了,要用Git Bash Here 启动才可以)nodemon --watch 'app/**/*' -e ts --exec ...
- brctl 命令详解
安装网桥管理工具包:bridge-utile ```# yum install bridge-utils -y``` ```使用brctl命令创建网桥br1```# brctl addbr br1`` ...