【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 简单对比时 ...
随机推荐
- binTreepreorderTraversal二叉树前序遍历
原题 Given a binary tree, return the preorder traversal of its nodes' values. For example: Given binar ...
- PM2管理工具的使用
linux上PM2可以管理服务程序,防止程序无故关闭,具有程序守护功能,自动重启服务器程序,监控程序等好处,很方便,具体自己去体会! 官网地址: http://pm2.keymetrics.io/ ...
- 5.无监督学习-DBSCAN聚类算法及应用
DBSCAN方法及应用 1.DBSCAN密度聚类简介 DBSCAN 算法是一种基于密度的聚类算法: 1.聚类的时候不需要预先指定簇的个数 2.最终的簇的个数不确定DBSCAN算法将数据点分为三类: 1 ...
- bash 替换特殊字符
bash 替换特殊字符 PID=`netstat -tpln|grep `;PID=${PID#*LISTEN};PID=`echo $PID | sed -s "s/\/java//g&q ...
- Redis入门——安装与基本命令
1. Redis安装 下载地址:https://github.com/MSOpenTech/redis/releases 下载zip文件后直接解压 2. 启动Redis服务端 解压目录下执行redis ...
- android dumpsys
dumpsys dumpsys is a tool that runs on Android devices and provides information about system service ...
- Python爬虫与数据图表的实现
要求: 1. 参考教材实例20,编写Python爬虫程序,获取江西省所有高校的大学排名数据记录,并打印输出. 2. 使用numpy和matplotlib等库分析数据,并绘制南昌大学.华东交通大学.江西 ...
- JustOj 1036: 习题6.11 迭代法求平方根
题目描述 用迭代法求 .求平方根的迭代公式为: X[n+1]=1/2(X[n]+a/X[n]) 要求前后两次求出的得差的绝对值少于0.00001. 输出保留3位小数 输入 X 输出 X的平方根 样例输 ...
- [转载]ASP.NET页面之间传递值的几种方式
页面传值是学习asp.net初期都会面临的一个问题,总的来说有页面传值.存储对象传值.ajax.类.model.表单等.但是一般来说,常用的较简单有QueryString,Session,Cookie ...
- php学习路线(转)
作者:Summer链接:https://www.zhihu.com/question/20034403/answer/135433912来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转 ...