題目大意:
給你乙個字串,問你它所有的公共前字尾(這裡和kmp不同的是認為:自身也可以是前字尾)
思路:這裡要知道next陣列的含義是:
字串下標從0開始
next[i] = k;
表示字串[0, i-1]的最長公共前字尾的長度為k
(並且前字尾的字元可以重複用: babab: 3(bab))
如果字串c有多個公共前字尾:
因為1和2是最長的公共前字尾,那麼1=2。
3和4也是公共前字尾,如圖還可以知道:3是1的字首,4是2的字尾。
當時1=2.所以:
3是1最長的公共字首,2是1最長的公共字尾。
同理:
所以我們就是求原串的最長公共前字尾。求最長公共前字尾的最長公共前字尾,。。。。。。。,一直到該串的最長公共前字尾=0。
當然最開始原串也算是自己的最長公共前字尾。
怎麼求自己最長公共前字尾的最長公共前字尾?
next[n]=自己最長公共前字尾的長度。那麼自己的最長公共前字尾為[0, next[n]-1]。
我們知道求[0, i-1]的最長公共前字尾就是next[i]。
那麼求[0, next[n]-1]的最長公共前字尾就是next[next[i]]一直迴圈下去
一直到next=0
#include
#include
#include
using
namespace std;
const
int maxn =
1000010
;char p[maxn]
;int f[maxn]
;vector<
int> v;
void
getval
(int l)
else
j = f[j];}
}int
main()
for(
int i=v.
size()
-1;i>=
0;i--
)printf
("\n");
}return0;
}
字串專題 擴充套件KMP
思路 乍一看就是擴充套件kmp,但這題還是要一點點轉化。如果想要滿足題目要求,匹配段肯定間隔是相反的。比如樣例中在0位置匹配 1 3 4 2 6 9 5 3 2 2 0 code include using namespace std const int ax 1e5 66 int n m int ...
( 字串專題 ) 擴充套件KMP
字串專題 擴充套件kmp 時間複雜度 o n m 用 extend i 表示t i n 1 與p的最長公共字首。假設t aaaab p aaaa 則extend 5 next i 表示為 串p 中以 i 為起點的字尾字串和 整個串p 的最長公共字首長度.假設p aaaab 則next 5 模板 in...
1576 替換所有的問號(字串)
1.問題描述 給你乙個僅包含小寫英文本母和 字元的字串 s,請你將所有的 轉換為若干小寫字母,使最終的字串不包含任何 連續重複 的字元。注意 你 不能 修改非 字元。題目測試用例保證 除 字元 之外,不存在連續重複的字元。在完成所有轉換 可能無需轉換 後返回最終的字串。如果有多個解決方案,請返回其中...