牛客練習賽70 重新排列

2022-05-05 12:39:11 字數 1537 閱讀 7663

時間限制:c/c++ 1秒,其他語言2秒 空間限制:c/c++ 262144k,其他語言524288k 64bit io format:

%lld

題目描述

牛牛有個很喜歡的字串」puleyaknoi「。

牛牛有t個很長很長的字串,他很喜歡把字串中的子串(連續的某段)打亂,並且按照自己的喜好重新排列。

如果牛牛能把一段重新排列出他喜歡的字串,他就會把這個子串稱作:喜歡的子串。

牛牛是個懶人,他不喜歡對太長的子串進行重排,那樣他會覺著眼鏡很累。

你能幫他求出對於每個字串,最短的喜歡的子串的長度是多少嗎?

如果沒有,請輸出-1。

輸入描述:

第一行乙個表示資料組數

接下來行每行乙個字串(保證字串只含小寫字母)

輸出描述:

共t行每行乙個答案

示例1輸入

複製

2

sxpuleyaaknoip

konijiwa

輸出

複製

11

-1

說明

sxpuleyaaknoip中puleyaaknoi可以重排成puleyaknoia,其中包含有puleyaknoi。

konijiwa不能重新排列出puleyaknoi,所以是-1

備註:t≤10,字串長度不超過10^5

題意很明確,我們來分析一下,我們所要找的滿足條件的區間沒有辦法一下確定,也就是這個區間是需要不斷調整的,因為找到乙個區間滿足條件後,有可能不是最簡情況,還能再縮,所以我們可以採用尺取法

我們一開始確定左邊界l=0,然後不斷更新右邊界r,直到r滿足條件,這樣就確定了乙個區間,記錄答案,然後左邊界l右移一位,然後右邊界在原先的基礎上找滿足情況的區間,更新區間最小值,這樣一直迴圈,我們找到了所有滿足情況的區間,並取得最小值,所以找到最優解

記得l右移動一位時,將原本l位置的資料刪除,因為原l的數已經不在現區間裡了

詳細看**

#include

using

namespace std;

string w=

"puleyaknoi"

;const

int maxn=

1e5+9;

int a[maxn]=;

int b[maxn]=;

const

int inf=

1e6+9;

bool

check()

return1;

}int

main()

while

(n--)if

(check()

)

a[s[l]

-'a']--

;}if(tot==inf)cout<<

"-1"

牛客練習賽70 重新排列

牛牛有個很喜歡的字串 puleyaknoi 牛牛有t個很長很長的字串,他很喜歡把字串中的子串 連續的某段 打亂,並且按照自己的喜好重新排列。如果牛牛能把一段重新排列出他喜歡的字串,他就會把這個子串稱作 喜歡的子串。牛牛是個懶人,他不喜歡對太長的子串進行重排,那樣他會覺著眼鏡很累。你能幫他求出對於每個...

牛客練習賽 70

二分答案,然後迴圈一邊即可。define io ios sync with stdio false cin.tie cout.tie 0 pragma gcc optimize 2 include include using namespace std const int n 100010 int ...

拼湊 牛客練習賽70

牛牛還是很喜歡字串 puleyaknoi 牛牛有t個超長超長的字串,不過這次他更懶了,他希望直接在字串中看見他喜歡的字串。如果乙個子串中含有乙個子串行是 puleyaknoi 那麼他就把這個子串稱作好的子串。牛牛是個懶人,他不喜歡看太長的子串,那樣他會覺著眼鏡很累。你能幫他求出對於每個字串,最短的好...