zoukankan      html  css  js  c++  java
  • 【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)。

     

     1 #include<iostream>
     2 #include<string.h>
     3 #include<cstdio>
     4 const int maxs = 1e4+5;
     5 using namespace std;
     6 int n,ans;
     7 char s[maxs*2];
     8 int main(){
     9     scanf("%d",&n);
    10     while(n--){
    11         scanf("%s",s+1);
    12         int lens = strlen(s+1);
    13         for(int i = 1;i <= lens; ++i) s[lens+i] = s[i];
    14         int i = 1,j = 2,k;
    15         while(i <= lens && j <= lens){
    16             for(k = 0;k <= lens && s[i+k]==s[j+k]; k++);
    17             if(k >= lens) break;
    18             if(s[i+k] > s[j+k]){
    19                 i = i+k+1;
    20                 if(i == j) i++;
    21             } else{
    22                 j = j+k+1;
    23                 if(i == j) j++;
    24             }
    25         }
    26         ans = min(i,j);
    27         printf("%d
    ",ans);
    28     }
    29     return 0;
    30 } 
    View Code
    G102的孤儿们都要好好的啊。
  • 相关阅读:
    js定时相关函数:
    远程控制使用kill软件映射内网进行远程控制(9.28 第十四天)
    PHP基础(9.27 第十三天)
    使用kali中的Metasploit通过windows7的永恒之蓝漏洞攻击并控制win7系统(9.27 第十三天)
    Nmap目录扫描和漏洞扫描(9.27 第十三天)
    JS正则和点击劫持代码(第十二天 9.27)
    Banner信息收集和美杜莎使用(9.26 第十二天)
    JavaScript的运算符、条件判断、循环、类型转换(9.25 第十一天)
    使用BurpSuite和Hydra爆破相关的服务(9.25 第十一天)
    JavaScript(第十一天 9.24)
  • 原文地址:https://www.cnblogs.com/ve-2021/p/9744867.html
Copyright © 2011-2022 走看看