zoj 1729 Hidden Password

Hidden Passwordhttp://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=729


Time Limit: 2 Seconds      Memory Limit: 65536 KB


Some time the programmers have very strange ways to hide their passwords. See for example how Billy "Hacker" Geits hide his password. Billy chooses a string S composed of small Latin letters with length L. Then he makes all L-1 one-letter left cyclic shifts of the string and takes as a password one prefix of the lexicographically first of the obtained strings (including S). For example let consider the string alabala. The cyclic one-letter left shifts (including the initial string) are:

alabala
labalaa
abalaal
balaala
alaalab
laalaba
aalabal

and lexicographically first of them is the string aalabal. The first letter
of this string is in position 6 in the initial string (the positions in the
string are counted from 0).

Write a program that for given string S finds the start position of the
smallest lexicographically one-letter left cyclic shift of this string. If the
smallest lexicographically left shift appears more than once then the program
have to output the smallest initial position.

Your program has to be ready to solve more than one test case. The first line
of the input file will contains only the number T of the test cases. Each of the
following T lines will describe one test case - first the length L of the string
(5 <= L <= 100000) and then, separated by one space, the string S
itself.

The output file have to contain exactly T lines with a single number each -
the initial position found by your program.

Sample Input

2
6 baabaa
7 alabala

Sample Output

1
6

又是最小表示法

#include<cstdio>
#include<algorithm>
#define N 100001
using namespace std;
char s[N];
int len;
int main()
{
    int n,i,j,k;
    scanf("%d",&n);
    while(n--)
    {
        scanf("%d",&len);
        scanf("%s",s);
        i=0; j=1;
        while(i<len&&j<len)
        {
            k=0;
            while(k<len && s[(i+k)%len]==s[(j+k)%len]) k++;
            if(k==len) break;
            if(s[(i+k)%len]<s[(j+k)%len]) j=max(j+k+1,i+1);
            else i=max(i+k+1,j+1);
        }
        printf("%d\n",min(i,j));
    }
}
时间: 2024-10-12 07:33:16

zoj 1729 Hidden Password的相关文章

[最小表示] zoj 1729 Hidden Password

题目链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=729 Hidden Password Time Limit: 2 Seconds      Memory Limit: 65536 KB Some time the programmers have very strange ways to hide their passwords. See for example how Billy "Hacker" G

ZOJ 1729 Hidden Password (字符串最小表示)

以前听过,不知道是什么,其实就是字符串首尾相连成一个环,n种切法求一个字典序最小的表示. 朴素算法大家都懂.O(n)的算法代码非常简单,最主要的思想是失配的时候尽可能大的移动指针. 另外附上一个不错的字符串算法总结:http://duanple.blog.163.com/blog/static/709717672009825004092/ #include<bits/stdc++.h> using namespace std; const int maxn = 1e5+5; char s[ma

洛谷P1709 [USACO5.5]隐藏口令Hidden Password

P1709 [USACO5.5]隐藏口令Hidden Password 题目描述 有时候程序员有很奇怪的方法来隐藏他们的口令.Binny会选择一个字符串S(由N个小写字母组成,5<=N<=5,000,000),然后他把S顺时针绕成一个圈,每次取一个做开头字母并顺时针依次取字母而组成一个字符串.这样将得到一些字符串,他把它们排序后取出第一个字符串.把这个字符串的第一个字母在原字符串中的位置-1做为口令. 如字符串alabala,按操作的到7个字符串,排序后得: aalabal abalaal a

P1709 [USACO5.5]隐藏口令Hidden Password

P1709 [USACO5.5]隐藏口令Hidden Password 题目描述 有时候程序员有很奇怪的方法来隐藏他们的口令.Binny会选择一个字符串S(由N个小写字母组成,5<=N<=5,000,000),然后他把S顺时针绕成一个圈,每次取一个做开头字母并顺时针依次取字母而组成一个字符串.这样将得到一些字符串,他把它们排序后取出第一个字符串.把这个字符串的第一个字母在原字符串中的位置-1做为口令. 如字符串alabala,按操作的到7个字符串,排序后得: aalabal abalaal a

【USACO 5.5.2】Hidden Password

题目大意 给出从一个字符环,求从哪个位置断开后的字符串的字典序最小. 题解 不多说,一条模板题.就是后缀数组(或后缀树). 先把字符串倍长,后缀数组预处理(请看相关资料),扫一遍SA数组,找符合条件的即可. 代码 /* TASK:hidden LANG:C++ */ #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int MAXN = 200005;

UVa 1314 Hidden Password

方法:最小表示法 题意即求最小表示法,带入模版即可. code: 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #include <iostream> 5 #include <string> 6 #include <vector> 7 #include <stack> 8 #include <bitset> 9 #includ

[USACO5.5]隐藏口令Hidden Password

题目链接:传送门 题目大意:给你一个长度 N 的字符串,5<=N<=5,000,000,将首尾合并成环,断环成链并满足字典序最小,输出此时首字母在原串中的位置-1: 题目思路:最小表示法 #include <iostream> #include <cstdio> #include <cstdlib> #include <cmath> #include <algorithm> #include <cstring> #incl

[USACO5.5]Hidden Password

题目大意: 求字符串最小表示. 思路: 本来按照lbn187的课件,知道SAM可以求字符串最小表示. 然而他并没有提供例题,就自己找了一道做. 大体思想就是把字符串复制一遍接在后面,构建SAM,然后每次跑小的转移. 跑n次以后就跑到了最小表示的末尾,用该状态的len值减去n就是最小表示的起始位置. 然后交上去就MLE了. 看了网上的题解发现求最小表示有专门的做法,也是O(n)的,还特别简单,不知道比SAM妙到哪里去了. 核心思想就是设两个指针i和j,表示目前比较的循环串的开头位置. 再用k表示目

SSH系列:(19)系统首页、子系统首页、登录页、项目主页

在这里,有三个名词需要区分:项目首页.系统首页.子系统首页.登录页. 项目首页是指在web.xml文件中配置的页面.   <welcome-file-list>     <welcome-file>index.jsp</welcome-file>   </welcome-file-list> 当一个系统比较大时,可能包含多个子系统.系统有自己的主页,称为系统首页:而子系统也有自己的主页,称为子系统首页. 登录页,则是用户进行登录的页面. 1.系统首页 (1)