時間限制: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 那麼他就把這個子串稱作好的子串。牛牛是個懶人,他不喜歡看太長的子串,那樣他會覺著眼鏡很累。你能幫他求出對於每個字串,最短的好...