[USACO5.5]Hidden Password

题目大意:
  求字符串最小表示。

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

 1 #include<cstdio>
 2 #include<iostream>
 3 int n;
 4 std::string s,t;
 5 int solve() {
 6     int i=0,j=1;
 7     while(i<n&&j<n) {
 8         int k=0;
 9         while(s[(i+k)%n]==s[(j+k)%n]&&k<n) k++;
10         if(k==n) break;
11         (s[(i+k)%n]>s[(j+k)%n]?i:j)+=k+1;
12         if(i==j) i++;
13     }
14     return std::min(i,j);
15 }
16 int main() {
17     std::cin>>n;
18     while(std::cin>>t) {
19         s+=t;
20     }
21     std::cout<<solve()<<std::endl;
22     return 0;
23 }
时间: 2024-12-12 15:03:32

[USACO5.5]Hidden Password的相关文章

洛谷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

[最小表示] 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

[USACO5.5]隐藏口令Hidden Password

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

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 hi

【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

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

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

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