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


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

    题目描述

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

    输入输出格式

    输入格式:

    第一行:一个数:N
    第二行开始:字符串:S(每72个字符一个换行符)

    输出格式:

    一行,为得到的口令

    输入输出样例

    输入样例#1:

    7
    anabana

    输出样例#1:

    6

    说明

    题目满足:
    30%的数据n<=10000
    70%的数据n<=100000
    100%的数据n<=5000000
    时限 1s
    题目翻译来自NOCOW。
    USACO Training Section 5.5
    //20170523新增数据四组

    #include<iostream>
    #include<cstring>
    #include<string>
    #include<cstdio>
    using namespace std;
    
    string str,jie;
    string bi,maxl;
    int pos;
    
    int main(){
        int n,s=0;
        cin>>n;
        while(getline(cin,jie)&&s<=n){
            int len=jie.size();
            for(int i=0;i<len;++i)
                if(islower(jie[i]))
                    str+=jie[i],s++;
        }
        maxl=str.substr(0,n);
        str+=str+str+str;
        for(int i=1;i<n;++i){
            bi=str.substr(i,n);
            if(bi<maxl)
                pos=i,maxl=bi;
        }
        printf("%d",pos);
        return 0;
    }
    

    速度很快的一个

    #include<iostream>
    #include<cstring>
    #define N 5000005
    using namespace std;
    
    char s[N];
    int n,ans;
    int t[N];
    
    int cat(int p,int q){
        for(register int i=0;i<n;i++)
            if(s[(p+i)%n]!=s[(q+i)%n])
                return s[(p+i)%n]<s[(q+i)%n];
        return 0;
    }
    
    int main(){
        std:ios::sync_with_stdio(false);
        cin>>n;int x=0;
        for(register int i=0;i<n;i++){
        	cin>>s[i];
        	t[i]++;
        	if(s[i]==s[i-1])
                t[x]++,t[i]--;
            else x=i;
        }
        for(register int i=1;i<n;i++)
        	if(t[i]!=0)
                if(cat(i,ans))
                	ans=i;
        cout<<ans;
        return 0;
    }
    

    首先就是如果一个字母前面有比和他一样的,这个字母就不用了

  • 相关阅读:
    经典基础算法之面试题(系列一)
    Shell脚本中的二维字符串列表
    网络字节流数据解析组件的设计与实现Circular Buffer(Ring Buffer)
    Django开发环境搭建(Windows+Python2.6)
    C++中堆(优先队列)的应用:make_heap, pop_heap, push_heap, sort_heap, priority_queue
    求逆序数的快速算法归并排序
    经典基础算法之BST详解(系列二)
    PHP数组去重
    微信小程序分享设置
    微信小程序判断开发环境
  • 原文地址:https://www.cnblogs.com/qdscwyy/p/7954122.html
Copyright © 2020-2023  润新知