1. 程式人生 > >洛谷P1709 [USACO5.5]隱藏口令Hidden Password

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

hidden txt data- ini 有時 tick splay cnblogs 輸入

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<cstdio>
#include<cstring>
using namespace std;
int n,ans;
string s,ss,snow;
int main(){
    freopen("Cola.txt","r",stdin);
    scanf("%d",&n);
    int tim=n/72;
    if(n/72*72!=n)tim++;
    for(int i=1;i<=tim;i++){
        cin>>ss;
        s
+=ss; } s+=s; snow=s.substr(0,n); for(int i=1;i<n;i++){//枚舉起點 for(int j=i,cnt=0;cnt<n;cnt++,j++){ if(snow[cnt]==s[j])continue; if(snow[cnt]<s[j])break; if(snow[cnt]>s[j]){ snow=s.substr(i,n); ans=i; break; } } } cout<<ans; }
93分 暴力 技術分享
#include <bits/stdc++.h>
using namespace std;
const int maxn=5000110;
int n;
char s[maxn*2];
int Mini(int l){    
    int i,j,k;  
    i=0;j=1;k=0;  
    while(i<l&&j<l){  
        k=0;  
        while(s[i+k]==s[j+k]&&k<l) k++;  
        if(k==l)return (i<j)?i:j;  
        if(s[i+k]>s[j+k])i=i+k+1;
        else j=j+k+1;
        if(i==j)j++;
    } 
    return (i<j)?i:j;
}     
int main(){
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>s[i];
        s[i+n]=s[i];
    }
    int l=Mini(n);
    cout<<l<<endl;
    return 0;
}
100分 貪心

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