東華oj 高階題第93題 隱藏口令

2021-10-03 23:38:18 字數 1836 閱讀 6403

93 隱藏口令

問題描述 :

有時候程式設計師有很奇怪的方法來隱藏他們的口令。

billy"hacker"geits會選擇乙個字串s(由l個小寫字母組成,5<=l<=100,000),然後他把s順時針繞成乙個圈。

如字串cbadfa,繞成乙個圈後,我們認為字串首尾相連。

每次取其中乙個字母作為起始字母,並順時針依次取字母而組成乙個字串。這樣將得到一些字串。

比如字串cbadfa,按照以上規則取出的字串有:

cbadfa badfac adfacb dfacba facbad acbadf

我們找到最小的那個字串,可知為acbadf,也可知道它的第乙個字元』a』在原字串cbadfa中為第6個字元(位置從1開始),

將得到的結果6減1得到5,這就是我們需要的口令。

再比如字串alabala,繞成乙個圈後,每次取其中乙個字母作為起始字母,並順時針依次取字母而組成乙個字串。這樣將得到一些字串:

alabala labalaa abalaal balaala alaalab laalaba aalabal

我們找到最小的那個字串,可知為aalabal,它的第乙個字母』a』在原字串中位置為7,7-1=6,則6為口令。

注:如果按照規則有兩個字串都是最小的,則取前面那乙個。 輸入說明 :

第一行:乙個數l

第二行及之後:字串s。

注意:字串s可跨多行,但其中的』\n』不算成s中的字元 輸出說明 :

一行,為得到的口令。

無多餘空格或空行。 輸入範例 : 6 cbadfa 輸出範例 : 5

**:

/*

t93 隱藏口令

*/#include

#include

#define max_size 100005

intmain()

oristr[i]

='\0'

;for

(i =

0; i < l; i++

) str[k]

='\0';if

(strcmp

(str, minstr)==-

1)}printf

("%d\n"

, minindex)

;return0;

}

我的思想是暴力破解,比較low

看了位大佬寫的,沒想到還能這麼解決,於是修改了下**:

/*

t93 隱藏口令

演算法概述:假設第i個位置往後取l個能達到最小。

再引入兩個變數j, k,j用於和i取到的相比較,k表示當前已經取了k個字母。

初始時i=0, j=1, k=0;根據比較的大小更新i,j,k的值,當k達到l的時候說明

比較完畢,此時輸出i和j中較小的那個

*/#include

#include

#define max_size 100005

intmain()

oristr[i]

='\0'

; i =

0, j =1;

while

(i < l && j < l && k < l)

else

if(i == j)

}printf

("%d\n"

, i < j ? i : j)

;return0;

}

參考了大佬

從這個題我學到了:

東華oj 高階題第11題

11 abc數字 問題描述 明明的爸爸是一位著名的數學家同時也是一位著名的數學啟蒙老師。他經常出一些簡單而有趣的數學題目來給剛剛接觸數學的小朋友做,培養他們對數學的興趣。一天,明明的爸爸想到了這樣乙個題目。如果有a b c三個1位的正整數,那麼按以下的方法構成2個三位數 第一種方法是a為百位,b為十...

東華oj 高階題第21題

21 回文質數 問題描述 因為151既是乙個質數又是乙個回文數 從左到右和從右到左是看一樣的 所以 151 號是回文質數。寫乙個程式來找出範圍 a,b 5 a b 100,000 間的所有回文質數 輸入說明 僅 1 行 二個整數 a 和 b 5 a b 100,000 輸出說明 輸出乙個回文質數的列...

東華oj 高階題第31題

31 最高頻率 問題描述 明明的爸爸是一位著名的數學家。他在明明很小的時候就發現明明有過人的數學天賦,因此有意培養他對數學的興趣。一次,明明的爸爸和明明玩起了乙個數字遊戲,這個遊戲的名字叫 最高頻率 在遊戲中,明明的爸爸要求明明在一串數字中,找出出現次數最多的那個數字,如果有多個數字出現的次數一樣,...