又是熱血沸騰的寫了一發kmp,看完題目,蹦出個迴圈節,emmm…
結論:
設len=n−nxt[n]
(新理解:其實就是重疊的那個部分嚶嚶嚶
(1) nxt[n]=0 不存在迴圈節
(2) nxt[n]>0 && n%len≠0 存在迴圈節但是長度不整除
(3) nxt[n]>0 && n%len=0 存在整除迴圈節
而且更長的迴圈節一定是len的倍數。
題目點我
題目意思呢就是給你乙個字串,求這個字串到第i個字元為止的迴圈節的次數。
比如aabaabaabaab,長度為12.到第二個a時,a出現2次,輸出2.到第二個b時,aab出現了2次,輸出2.到第三個b時,aab出現3次,輸出3.到第四個b時,aab出現4次,輸出4.
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define pb push_back
using
namespace std;
typedef
long
long ll;
const
int inf =
0x3f3f3f3f
;const ll inf =
0x3f3f3f3f3f3f3f3f
;#define pq priority_queue
int n;
const
int maxn =
1e6+5;
char s[maxn]
;int next[maxn]
;void
get_next
(char s)
else
j = next[j];}
}int
main()
}printf
("\n");
}return0;
}
KMP演算法 next陣列的應用 迴圈節問題
先來個next陣列模板 void next int i 0,j 1 next 0 1 while i 1 i next i 是最小迴圈節的長度 2 字串的迴圈條件是i i next i 0 next i 0 3 最小迴圈節的迴圈次數是i i next i 4 整體 在 字串 s l strlen s...
NEXT陣列與字串最小迴圈節
結論 通過next陣列,可以得到字串的最小迴圈節。設字串s的結尾下標為i,next i j,如果 left j ne0 i i j 0 end right.成立,那麼s j 1,i 就是字串的最小迴圈節。簡要說明 1 x j y i 設s x,j s j,i 由於s 1,j s y,i 並且 s 1...
迴圈節長度以及迴圈節
迴圈節長度 兩個整數做除法,有時會產生迴圈小數,其迴圈部分稱為 迴圈節。比如,11 13 6 0.846153846153 其迴圈節為 846153 共有6位。這是一道藍橋杯的題目,試卷上是乙個填空題,思路就是不斷的對除數取餘,然後乘10後再取餘,直到餘數在之前出現過或者為0 結束。為什麼是這樣的呢...