【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 简单对比时 ...
随机推荐
- CentOS下Docker安装
CentOS下Docker安装 1.安装: #sudo yum install docker 2.启动并加入开机启动: A.#sudo systemctl start docker B.#sudo s ...
- python pandas模块,nba数据处理(1)
pandas提供了使我们能够快速便捷地处理结构化数据的大量数据结构和函数.pandas兼具Numpy高性能的数组计算功能以及电子表格和关系型数据(如SQL)灵活的数据处理能力.它提供了复杂精细的索引功 ...
- DataRow 点不出 Select
DataRow 点不出 Select?why?using system.linq;
- Yii DataProvider
- mysql+servlet+jsp实现数据库的增删改查
首先,了解数据库目前我们仅仅用来存放数据,在这里我们在数据库中生成一个表,包含id,classname,teacher,location.Tomcat用来配置eclipse,只有这样我们才能使用JSP ...
- javascript 链式写法
熟悉Jquery的同学都知道,它对dom的操作基本都链式调用的写法,这种给人感觉就是很简洁,易懂,而且最大的好处就是避免多次重复使用一个对象变量. 链式的实现方式:链式操作是在对象的方法中通过最后返回 ...
- 三角形垂点坐标js算法(三点定圆求圆心)
已知平面三点坐标A(x1, y1).B(x2, y2).C(x3, y3),三点定圆也就是三角形的中垂线交点, //平面三点定位算法 function locate(x1, y1, x2, y2, x ...
- Python+OpenCV图像处理(九)—— 模板匹配
百度百科:模板匹配是一种最原始.最基本的模式识别方法,研究某一特定对象物的图案位于图像的什么地方,进而识别对象物,这就是一个匹配问题.它是图像处理中最基本.最常用的匹配方法.模板匹配具有自身的局限性, ...
- 前端框架VUE----babel
这个是解析我们es6的代码的,为什么要用它呢,因为对于一些ie浏览器,甚至FF浏览器,低版本的还不能识别我们的es6代码,那么vue里面好多还让我们去写es6的代码,这个时候我们就可以用babel这个 ...
- jdbc连接 orale 和 mysql 所需要的jar包
oracle: ojdbc6-12.1.0.2.jar mysql: mysql-connector-java-5.1.47.jar