HDU3746 (KMP)字串最小迴圈節問題

2021-10-09 02:34:05 字數 1107 閱讀 5703

傳送門

題意: 給你乙個串,要你在串頭或尾新增最少的字元,使得該串至少有2個迴圈節,問你最少需要加幾個字元.

如:aaa ---- 迴圈為 a 已有3個迴圈節

abca ----- 迴圈節為abc 至少在末尾加 bc 使得該串至少有2個迴圈節;

abcde ---- 迴圈節為abcde 至少在末尾加 abcde 使得該串至少有2個迴圈節;詳解

分析:考察對next陣列的理解 :len-next[len-1] 即為字首字串的最小週期(迴圈節);

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define inf 0x3f3f3f3f

using

namespace std;

typedef

long

long ll;

typedef

unsigned

long

long ull;

const

int maxn=

2e5+

100;

int next[maxn]

;char p[maxn]

;void

next_pre()

}int

main()

return0;

}

int n,ls,next[maxn]

;char s[maxn]

;int

next_pre()

int len=ls-next[ls-1]

;if(next[ls-1]

==0)return ls;

if(ls%len!=0)

return len-ls%len;

else

return0;

}int

main()

}

HDU3746 KMP 最小迴圈節

最小迴圈節求法 定理 假設s的長度為len,則s存在最小迴圈節,迴圈節的長度l為len next len 子串為s 0 len next len 1 1 如果len可以被len next len 整除,則表明字串s可以完全由迴圈節迴圈組成,迴圈週期t len l。2 如果不能,說明還需要再新增幾個字...

hdu3746(kmp最小迴圈節)

題意 問在乙個字串末尾加上多少個字元能使得這的字串首尾相連後能夠迴圈 題解 就是利用next的性質求最小迴圈節 kmp求最下迴圈節 ans len next len ans就是最小迴圈節長度證明看那個部落格。然後就簡單了。include include include using namespace...

kmp找最小迴圈節,hdu3746

字串的長度為len 最小迴圈節的長度l len next len 需要補齊的字元個數r l len l 這個題沒啥大的問題,就是輸入很奇怪,如果用cin,getline 會錯,用scanf s s 就對了 include include include include include include...