可愛即正義 kmp二星水題 傳送門
小可愛是個可愛的女孩子(nzdl)。
眾所周知,小可愛在物競初賽時候有兩道大題沒有做出來,所以,可愛的小可愛(qwq)便沉浸在了毒瘤之中——無法接受在任何地方看到"suqingnianloveskirito"這個東西。然而,這時候從sd某處送來了一封安慰信(情書),信的內容是乙個26個小寫拉丁字母組成的字串s。這封信提前被wyxdrqc劫了下來(沒錯,就是這個劫),他開啟了這封信,結果發現了滿篇的"suqingnianloveskirito"所以他想篡改這封信。
由於他的能力有限,所以他只能把這個字串的其中兩個位置上的字元互換,而且只能操作一次。
他現在想問你,通過他的操作能不能使"suqingnianloveskirito"不是這個字串的子串。
一行乙個字串s
如果他能通過只交換其中的兩個位置上的字元使"suqingnianloveskirito"不是交換後的字串的子串,則在第一行輸出乙個yes,之後一行輸出兩個數d1,d2,表示你的方案是把原字串在位置d1和位置d2上的字元互換,字串的第乙個字元的位置是1。對字串pattern=「suqingnianloveskirito」,進行kmp字首處理獲得next陣列,然後讓輸入字串s進行kmp匹配,返回s中含有n個字串pattern,並記錄第一次和第二次子串的首位置的下標。如果他不管交換那兩個字元都不能滿足條件,直接輸出一行no。
因為只能交換字串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 項,這種形式之和自己陣列...