牛客18984 可愛即正義 KMP

2021-10-07 18:46:07 字數 1789 閱讀 8596

可愛即正義 kmp二星水題 傳送門

小可愛是個可愛的女孩子(nzdl)。

眾所周知,小可愛在物競初賽時候有兩道大題沒有做出來,所以,可愛的小可愛(qwq)便沉浸在了毒瘤之中——無法接受在任何地方看到"suqingnianloveskirito"這個東西。然而,這時候從sd某處送來了一封安慰信(情書),信的內容是乙個26個小寫拉丁字母組成的字串s。這封信提前被wyxdrqc劫了下來(沒錯,就是這個劫),他開啟了這封信,結果發現了滿篇的"suqingnianloveskirito"所以他想篡改這封信。

由於他的能力有限,所以他只能把這個字串的其中兩個位置上的字元互換,而且只能操作一次。

他現在想問你,通過他的操作能不能使"suqingnianloveskirito"不是這個字串的子串。

一行乙個字串s

如果他能通過只交換其中的兩個位置上的字元使"suqingnianloveskirito"不是交換後的字串的子串,則在第一行輸出乙個yes,之後一行輸出兩個數d1,d2,表示你的方案是把原字串在位置d1和位置d2上的字元互換,字串的第乙個字元的位置是1。

如果他不管交換那兩個字元都不能滿足條件,直接輸出一行no。

對字串pattern=「suqingnianloveskirito」,進行kmp字首處理獲得next陣列,然後讓輸入字串s進行kmp匹配,返回s中含有n個字串pattern,並記錄第一次和第二次子串的首位置的下標。

因為只能交換字串s的中的兩個字元,故

①n>2時,no

②n=2時,yes,可交換第乙個子串的第乙個字元和第二個子串的第二個字元

③n=1時,在從子串中首位置和字串s首位置開始乙個乙個交換後嘗試kmp字串匹配,直到交換出符合條件的位置

④n=0時,若s的長度小於pattern的長度,故肯定存在,隨機交換即可;若s的長度大於pattern的長度,就可以嘗試s[0]與s[1],s[0]與s[2]…s[0]與s[s.size()-1],s[1]與s[2],s[1]與s[3]交換,直到嘗試出kmp字串匹配返回匹配成功次數為0為止

#pragma gcc optimize(2)

#include

using

namespace std;

const

int max=

1e6+7;

int nt[max]

;int a=

0,b=0;

void

kmp_next

(string pattern,

int next)

else

j=next[j];}

}int

kmp(string s,string pattern,

int next)

else j=next[j];if

(j==lp)

}return flag;

}int

main()

else

else

if(n==2)

else

if(n==1)

else

swap

(s[i]

,s[j]);

}}} cout<<

"no";}

else

else

swap

(s[i]

,s[j]);

}}} cout<<

"no";}

}return0;

}

牛客字串KMP訓練題 可愛即正義

一開始的時候怎麼也想不明白,根本就不知道時間複雜度怎麼優化,後來在左神左學長的指點下,發現了字串的模式串是給定的,並且其無法在其本身上找到一段與其本身匹配的地方,也就是說,沒有辦法在母串上找到多個相互交錯的模式串 接下來就簡單了,分別討論母串上找到的模式串有times個的情況 當times 2時,無...

牛客 Barn Echoes (擴充套件KMP)

給出兩個字串,求乙個字串的字首與另乙個字串的字尾最長重疊長度 採用擴充套件kmp可以輕鬆解決此題 include include include include using namespace std string str1,str2,s1,s2 設從i位置開始的s的字尾串為s0i void z f...

牛客網 慄醬的數列 kmp

解題思路 其實一開始我只想到了暴力的方法,複雜度mn.後來網上找了題解 發現竟然還可以用kmp做,因為題目要求 a 1 b1 k a 2 b2 k a m bm k。那麼可以改造一下,變成 a2 a1 b2 b1 k 0,這樣就有可比性了。分成 a2 a1 項和 b2 b1 項,這種形式之和自己陣列...