锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
鏈矙鑼跺湪2009騫?鏈堟浘緇忓湪k-i+1}, i<=k<j錛岀浜岄」闇瑕佹弧瓚沖師瀛楃涓瞇i..j]榪欎竴孌墊伆濂界敱[i..k]榪欎竴孌電殑鑻ュ共嬈″鍒跺緱鍒皚
錛堝姞涓妅-i+1鏄洜涓哄浜庝互涓嬩笁縐嶉噸鍙犲瓧絎︿覆錛屼笉鍘嬬緝姣斿帇緙╄鐭細AA鍨嬨丄AA鍨嬨丄BAB鍨嬶級
杈圭晫錛欶[i][i]=1錛?br />
闂鏄湪涓婅堪鏂圭▼鐨勭浜岄」閲屽浣曟眰鍑哄彲琛岀殑k銆傛樉鐒訛紝鍙渶瑕佸[i..j]榪欎竴孌典綔exKMP錛屾眰鍑簄x錛岀劧鍚巏鍙褰撲笖浠呭綋婊¤凍錛氾紙1錛塶x[k+1]=j-k錛涳紙2錛?k-i+1)|(j-i+1)錛?br />
涓嶈繃錛屾湰棰樺湪鍐檈xKMP鐨勮繃紼嬩腑浼氬嚭鐜板緢鍥х殑闂……鐢變簬涓嬫爣涓嶆槸浠?寮濮嬶紝鑰屾槸浠巌寮濮嬶紝鎵浠ュ緢澶氬湴鏂瑰叧浜庝笅鏍囩殑璁$畻閮借鏀規帀錛岄潪甯鎬笉鏂逛究錛岃屼笖寰堝鏄撶柕鎺夈備笌鍏惰繖鏍鳳紝榪樹笉濡傛妸[i..j]榪欎竴孌靛鍒跺埌涓涓柊瀛楃涓查噷錛屼笅鏍囦粠0寮濮嬨傚浜庡叾瀹冪殑鏌愪簺瀛楃涓茬畻娉曞拰鏁版嵁緇撴瀯錛屾垨璁鎬篃鏄繖鏍峰洤……
浠g爜錛?br />
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
using namespace std;
#define re(i, n) for (int i=0; i<n; i++)
#define re1(i, n) for (int i=1; i<=n; i++)
#define re2(i, l, r) for (int i=l; i<r; i++)
#define re3(i, l, r) for (int i=l; i<=r; i++)
#define rre(i, n) for (int i=n-1; i>=0; i--)
#define rre1(i, n) for (int i=n; i>0; i--)
#define rre2(i, r, l) for (int i=r-1; i>=l; i--)
#define rre3(i, r, l) for (int i=r; i>=l; i--)
#define ll long long
const int MAXN = 110, INF = ~0U >> 2;
int n, F[MAXN][MAXN], nx[MAXN], res;
char ss[MAXN + 1], ss0[MAXN + 1];
void init()
{
scanf("%s", ss); n = strlen(ss);
}
int sol0(int l, int r)
{
int W = r - l + 1; re3(i, l, r) ss0[i - l] = ss[i];
nx[0] = W; nx[1] = nx[0] - 1; re(i, W) if (ss0[i] != ss0[i + 1]) {nx[1] = i; break;}
int k = 1, len, p = k + nx[k] - 1, x, y;
re2(i, 2, W) {
len = nx[i - k];
if (i + len <= p) nx[i] = len; else {
x = p + 1; y = p - i + 1; if (y < 0) {x++; y = 0;}
for (; x<=W && ss0[x]==ss0[y]; x++, y++) ;
nx[i] = y; k = i; p = i + y - 1;
}
}
int res0 = INF, tmp, V;
re2(i, 1, W) if (!(W % i) && nx[i] == W - i) {
V = F[l][l + i - 1] + 2; tmp = W / i; while (tmp) {tmp /= 10; V++;}
if (W < V) V = W;
if (V < res0) res0 = V;
}
return res0;
}
void solve()
{
re(i, n) F[i][i] = 1;
int j, tmp;
re2(x, 1, n) re(i, n-x) {
j = i + x; F[i][j] = sol0(i, j);
re2(k, i, j) {tmp = F[i][k] + F[k + 1][j]; if (tmp < F[i][j]) F[i][j] = tmp;}
}
res = F[0][n - 1];
}
void pri()
{
printf("%d\n", res);
}
int main()
{
init();
solve();
pri();
return 0;
}
]]>
浠婂ぉ鍦ㄥ洖欏句互鍓嶇殑棰樼洰鐨勬椂鍊欙紝縐冪劧鍙戠幇COCI 2011锝?012 #5鐨勫悗涓ら騫墮潪紲炵妵棰橈紙鑷沖皯涓鑸漢鍙互鎹夌殑錛?#8230;…鏄垜褰撴椂鎯沖偦鎺変簡鍥?#8230;…
blokovi錛?br />棣栧厛寰堝鏄撳彂鐜版渶浼樻柟妗堝繀鐒舵槸浠庨《鍒板簳錛屽厛灝介噺寰鍙寵竟鏀撅紝鏀懼埌鏌愪竴涓漿鎶樼偣澶勫啀灝介噺寰宸﹁竟鏀?#8230;…
鐒跺悗灝辨槸鏋氫婦榪欎釜杞姌鐐癸紝涔辯畻涓涓嬪氨琛屼簡錛屾毚鍔汷(N2)鐨勫彲浠ヨ繃7涓偣錛堟湰娌欒尪鐜板満璧涙椂灝辨槸鐢ㄨ繖涓殑錛?#8230;…
浼樺寲錛氬彲浠ヤ粠涓婂埌涓嬩緷嬈℃灇涓捐漿鎶樼偣錛岃鐩墠鐨勮漿鎶樼偣涓篿錛屽垯鍦ㄤ笅涓嬈℃灇涓炬椂錛?i+1)涓鴻漿鎶樼偣錛夛紝鎶?i+1)寰鍙沖鉤縐?鍗曚綅錛岀劧鍚庢牴鎹偅涓噸蹇冭綆楀叕寮忓彲浠ュ緱鍑猴紝絎?i+2)涓強浠ュ悗鐨勫繀鐒舵槸鏁翠綋鍚戝彸騫崇Щ(2*m2)/(m1+m2)錛屽叾涓璵1涓哄墠i涓殑璐ㄩ噺鍜岋紝m2涓虹(i+1)涓殑璐ㄩ噺……鍦ㄦ鍩虹涓婄淮鎶よ漿鎶樼偣鍓嶉噸蹇冧綅緗佽漿鎶樼偣鐨勯噸蹇冪殑妯潗鏍囷紙鐩稿浜庢渶涓婇潰鐨勯偅涓級浠ュ強鏈涓嬮潰鐨勯偅涓殑閲嶅績鐨勬í鍧愭爣錛堢浉瀵逛簬鏈涓婇潰鐨勯偅涓級灝辮浜嗭紙娉ㄦ剰杞姌鐐規槸絎竴涓垨鏈鍚庝竴涓殑鐗規畩鎯呭喌瑕佸崟鐙鐞嗭級錛屾椂闂村鏉傚害O(N)銆?br />
poplocavanje錛?br />鍏跺疄榪欓鍙鐢ˋC鑷姩鏈洪殢渚夸貢鎼炰竴涓嬪氨琛屼簡……Trie涓婄殑姣忎釜緇撶偣緇存姢涓涓狵K錛岃〃紺鴻緇撶偣鎵浠h〃鐨勫瓧絎︿覆鐨勫悗緙鐨勬渶澶у尮閰嶉暱搴︼紙褰撶劧鍓嶆彁鏉′歡鏄緇撶偣鏄嵄闄╃殑錛夛紝鍒欙細錛?錛夎嫢璇ョ粨鐐規湰鏉ュ氨浠h〃涓涓緟鍖歸厤鐨勫瓙涓詫紝鍒橩K鍊間負瀛愪覆闀垮害錛涳紙2錛夎嫢璇ョ粨鐐規槸閫氳繃澶辮觸鎸囬拡涓婃函鍒頒竴涓嵄闄╃粨鐐圭殑錛屽垯璇ョ粨鐐圭殑KK灝辨槸涓婃函鍒扮殑閭d釜鍗遍櫓緇撶偣鐨凨K銆傜劧鍚庡仛涓嬈″尮閰嶏紝璁頒笅鎵鏈夌殑鍖歸厤鍖洪棿錛屽啀姹傚嚭鏈鍖洪棿瑕嗙洊鐨勬婚暱搴︼紙鎺掑簭+鎵弿鍗沖彲錛屼笉闇浠諱綍鏁版嵁緇撴瀯錛夊氨琛屼簡銆?br />
娉ㄦ剰鍑犱釜鏄撶柕鐨勫湴鏂癸細
錛?錛塗rie鐨勫ぇ灝忚寮鍒?M鎵嶈兘榪囷紙涓嶈繃鍐嶅ぇ灝辮MLE浜嗗洤……錛夛紱
錛?錛夊湪寤鴻嚜鍔ㄦ満璁$畻KK鐨勬椂鍊欙紝濡傛灉涓涓粨鐐規湰鏉ュ氨鏄嵄闄╃殑錛堝嵆涓婅堪絎?縐嶇粨鐐癸級錛屾榪囩▼涓張鍙戠幇瀹冩槸涓婅堪絎?縐嶇粨鐐癸紝鍒?strong>涓?/span>鑳介噸鏂拌綆桲K錛?br />錛?錛夋渶鍚庢眰鏈鍖洪棿瑕嗙洊鎬婚暱搴︾殑鏂規硶錛氬厛璁頒笅鎵鏈夌殑鍖洪棿錛屾寜鐓у厛宸︾鐐歸掑搴忓悗鍙崇鐐歸掑搴忔帓搴忥紝褰撲腑鍘繪帀琚埆鐨勫尯闂磋鐩栫殑鍖洪棿錛岀劧鍚庡厛鐪嬩竴涓嬫帓搴忓悗鐨勭涓涓尯闂村拰鏈鍚庝竴涓尯闂達紝寰楀嚭絎竴涓尯闂翠箣鍓嶄笌鏈鍚庝竴涓尯闂翠箣鍚庣殑鏈瑕嗙洊鐨勯儴鍒嗭紝涓棿鐨勬壂鎻忔眰瑙f椂錛屽鏋滄煇鍖洪棿鐨勫乏绔偣澶т簬(鍓嶄竴鍖洪棿鐨勫彸绔偣+1)錛屽垯璁″叆涓棿鐨勭┖褰?#8230;…涓嶈繃榪樻湁涓縐嶆柟娉曞氨鏄笉鍘繪帀琚埆鐨勮鐩栫殑鍖洪棿錛岃屾槸鍦ㄦ壂鎻忚繃紼嬩腑緇存姢鍙崇鐐規渶澶у糾axr錛岀劧鍚庢妸涓婇潰鏂規硶涓殑鎵鏈夊彸绔偣鏀逛負maxr鍗沖彲銆?br />
浠g爜錛?br />blokovi poplocavanje
]]>
銆愪緥1銆?a title="HDU3689" >HDU3689
棰樻剰錛氬瓧絎﹂泦涓湁涓浜涘瓧絎︼紝緇欏嚭姣忎釜瀛楃鐨勫嚭鐜版鐜囷紙瀹冧滑鐨勫拰淇濊瘉涓?錛夛紝鍐嶇粰鍑轟竴涓瓙涓睟錛屾眰錛氫換緇欎竴涓暱搴︿負N鐨勫瓧絎︿覆A錛堝彧鑳藉寘鍚瓧絎﹂泦涓殑瀛楃錛夛紝浣垮緱S鏄疉鐨勫瓙涓茬殑姒傜巼銆?br />
姹傝В榪欑被闂棣栧厛瑕佽繘琛岃ˉ闆嗚漿鍖栥傚洜涓哄瓙涓插彲鑳芥湁閲嶅彔錛堟瘮濡?ababa"涓氨鍑虹幇浜嗕袱涓?aba"錛夛紝鎵浠ュ厛杞寲涓?#8220;姹備換緇欎竴涓暱搴︿負N鐨勫瓧絎︿覆A錛堝彧鑳藉寘鍚瓧絎﹂泦涓殑瀛楃錛夛紝浣垮緱B涓嶆槸A鐨勫瓙涓?/strong>鐨勬鐜?#8221;錛岀劧鍚庡啀鐢?鍑忓幓榪欎釜姒傜巼鍗充負緇撴灉銆?br />璁綟[i][j]涓?#8220;鍦ㄦ墍鏈夐暱搴︿負i鐨?span style="color: red">涓嶅嚭鐜癇鐨勫瓧絎︿覆涓紝鍚庣紑涓嶣鐨勫墠緙鍖歸厤闀垮害涓簀錛堝嵆璇ュ瓧絎︿覆鐨勫悗緙涓嶣鐨勫墠緙鐨?span style="color: red">鏈澶?/strong>鍖歸厤闀垮害涓簀錛夌殑姒傜巼”錛屽緢鏄劇劧錛孎鏄敱閫掓帹寰楀埌浜嗭紝鍏抽敭鏄浣曡繘琛岀姸鎬佽漿縐伙紵鎴栬呰錛屽湪閫掓帹榪囩▼涓紝鍝簺鐘舵佸彲鑳芥垚涓篎[i][j]鐨勫墠瓚嬬姸鎬侊紵
鍋囪F[i-1][k]鏄疐[i][j]鐨勫墠瓚嬬姸鎬侊紝涔熷氨鏄錛?span style="color: red">鍦ㄥ瓧絎﹂泦涓嚦灝戝瓨鍦ㄤ竴涓瓧絎錛屼嬌寰椾富涓茬殑絎琲浣嶏紙鏈鍚庝竴浣嶏級鍙朿鏃訛紝鑳藉浠嶧[i-1][k]杞Щ鍒癋[i][j]銆傝繖灝遍渶瑕佹眰涓涓糞[k][c]錛岃〃紺哄綋涓諱覆鐨勫悗緙涓嶣鐨勫墠緙鐨勶紙鏈澶э級鍖歸厤闀垮害涓簁鏃訛紝鍦ㄤ富涓插悗鍐嶅姞涓婁竴涓瓧絎錛屽叾鍖歸厤闀垮害浼氬彉鎴愪粈涔堛備婦渚嬶細璁劇洰鍓嶄富涓睞'="abasab"錛孊="asabs"錛屽叾鍖歸厤闀垮害涓?錛岃嫢鍦ˋ'鍚庡姞涓婁竴涓瓧絎?s'錛屽垯鍖歸厤闀垮害鍙樹負5錛屾墍浠[4]['s']=5錛岃岃嫢鍦ˋ'鍚庡姞涓婁竴涓瓧絎?a'錛屽垯鍖歸厤闀垮害浼氬彉鎴?錛屾墍浠[4]['a']=1銆傛樉鐒禨鍊煎拰A鍓嶉潰鐨勫摢浜涘瓧絎︽槸娌℃湁鍏崇郴鐨勩?br />閭d箞榪欎釜S鍊煎浣曡綆楋紵鍏跺疄鍙互鍙戠幇錛孲鍜孠MP綆楁硶涓殑nx鏁扮粍紲炰技錛屽洜姝ゅ畬鍏ㄥ彲浠ユ寜鐓ц綆梟x鏁扮粍鐨勫姙娉曟潵璁$畻S銆傚叿浣撴潵璇達紝鍏堣瀵笲浣淜MP鑷韓鍖歸厤錛屾眰鍑哄叾nx鏁扮粍錛岀劧鍚庯紝鍦ㄦ眰S[k][c]鐨勬椂鍊欙紝灝濊瘯鍦˙鐨勭k浣嶏紙鐢變簬B鐨勪笅鏍囦粠0寮濮嬫墍浠[k-1]錛夊悗鍔犱笂瀛楃c錛岀湅鐪嬩細“鍥為”鍒板摢閲屽嵆鍙備唬鐮侊細
re2(i, 1, m) {
while (j && A[i] != A[j]) j = nx[j - 1];
if (A[i] == A[j]) j++;
nx[i] = j;
}
re(i, m) re(k, SZ) {
j = i;
while (j && A[j] != k + 97) j = nx[j - 1];
if (A[j] == k + 97) S[i][k] = ++j; else S[i][k] = 0;
}
浠g爜
銆愪緥2銆?a title="PKU1625" >PKU1625錛?a title="URAL1158" >URAL1158錛?br />棰樻剰錛氱粰鍑轟竴浜涘瓙涓詫紝姹傞暱搴︿負N錛屽悇涓瓧絎﹂兘灞炰簬緇欏畾鐨勫瓧絎﹂泦鐨勬墍鏈夊瓧絎︿覆涓紝涓嶅寘鍚換浣曚竴涓粰鍑虹殑瀛愪覆鐨勫瓧絎︿覆涓暟錛堥渶瑕佷嬌鐢ㄥ帇9浣嶇殑楂樼簿搴︼級銆?br />
鏈鏄劇劧鏄愪緥1銆戠殑澶氬瓙涓插艦寮忥紝鑰岀敤鏉ヨВ鍐沖涓瓧絎︿覆鍚屾椂鍖歸厤鐨勫彧鏈堿C鑷姩鏈猴紝閭d箞濡備綍鍦ㄦ湰棰樹腑浣跨敤AC鑷姩鏈烘眰瑙e憿錛?br />瑙傚療銆愪緥1銆戜腑鐨凢[i][j]錛屽彲浠ユ兂璞′竴涓嬶紝涓涓浘涓湁m涓《鐐癸紝鍒嗗埆琛ㄧず鍖歸厤闀垮害涓?..(m-1)錛岀劧鍚庝笉鏂柊鍔犲叆鐨勫瓧絎﹁榪欎簺鐘舵佸湪榪欎簺緇撶偣闂翠笉鏂漿縐伙紙鐘舵佽漿縐誨氨鏄浘涓殑杈癸級錛岃繖鏍鳳紝F[i][j]灝辮〃紺?#8220;闃舵i鍒拌揪緇撶偣j涓?#8221;銆傝孉C鑷姩鏈烘槸鍩轟簬Trie錛堟爲錛夌殑錛?/span>鍏朵腑鏈夌幇鎴?/span>鐨勭粨鐐癸紝榪欏氨鎻ず浜嗘湰棰樼殑鐘?/span>鎬?/span>錛?/strong>
F[i][j]琛?/span>紺?/span>闀垮害涓篿鐨勫悎娉曠殑瀛楃涓詫紙灝辨槸婊¤凍瀛楃闆嗛檺鍒朵笖涓嶅寘鍚換浣曚竴涓粰瀹氬瓙涓詫級涓紝鍦ㄥ尮閰嶅埌鏈鍚庝竴浣嶏紙絎琲浣嶏級鍚庯紝鍒氬ソ鍒拌揪緇撶偣j鐨勫瓧絎︿覆鐨?/strong>涓暟銆?br />鍚屾牱錛孲[k][c]琛ㄧず“鐩墠鍒拌揪緇撶偣k錛屾帴涓嬫潵鐨勪竴涓瓧絎︽槸c鐨勬椂鍊欙紝浼氬埌杈懼摢涓粨鐐廣傚湪瀵規墍鏈夌殑瀛愪覆寤虹珛浜嗚嚜鍔ㄦ満涔嬪悗錛孲鍊煎彧瑕佺被浼煎湴鎼炲氨鑳芥眰鍑烘潵浜嗐傜劧鍚嶧鐨勮漿縐諱篃灝辨悶瀹氫簡銆?br />涓嶈繃錛屾湰棰樿涓囧垎娉ㄦ剰AC鑷姩鏈虹殑涓涓狟UG錛氬湪寤虹珛浜嗚嚜鍔ㄦ満浠ュ悗錛岄渶瑕佹妸鎵鏈夋湰韜笉鍗遍櫓錛堝鏋滀竴涓粨鐐逛唬琛ㄧ殑瀛楃涓插垰濂芥槸鏌愪竴涓粰鍑虹殑涓嶈兘鍑虹幇鐨勫瓙涓詫紝鍒欒緇撶偣鏄嵄闄╃粨鐐癸級錛屼絾閫氳繃澶辮觸鎸囬拡涓嶆柇涓婃函鑳藉鍒拌揪涓涓嵄闄╃粨鐐圭殑緇撶偣錛屼篃鏍囪涓哄嵄闄╃粨鐐癸紝姣斿涓や釜瀛愪覆鏄?abcde"鍜?bc"錛屽垯浠h〃"abcd"鐨勯偅涓粨鐐圭敱浜庡寘鍚簡"bc"鎵浠ヤ篃鏄嵄闄╃殑銆?br />姝ゅ錛屾湰棰樼殑杈撳叆瑕佹敞鎰忥紝瀛楃闆嗙殑ASCII鐮佽寖鍥存槸-128~127錛屾墍浠ュ繀欏葷敤char鑰屼笉鏄痷nsigned char錛屼笖鐢變簬鍙兘鍖呭惈絀烘牸鎵浠ュ繀欏葷敤gets()鑰屼笉鏄痵canf()杈撳叆錛屽張鍥犱負C/C++涓湪鏈夎礋鏁頒笅鏍囷紝鍥犳鍦ㄨ緭鍏ヤ箣鍚庤繕瑕佽漿鍖栦竴涓嬶紙鍔?28錛夈?br />
浠g爜
銆愪緥3銆?a title="PKU3691" >PKU3691
棰樻剰錛氱粰鍑轟竴浜涘瓙涓插拰涓涓瓧絎︿覆A錛堝叾姣忎釜瀛楃鍧囧睘浜庡瓧絎﹂泦{'A', 'C', 'G', 'T'}錛夛紝姹傝嚦灝戣鏀瑰姩A鐨勫嚑涓瓧絎︼紙涓嶈兘鏀規垚涓嶅睘浜庡瓧絎﹂泦鐨勫瓧絎︼級錛屼嬌寰楀畠涓嶅寘鍚換浣曚竴涓粰鍑虹殑瀛愪覆錛岃嫢涓嶇鎬庝箞鏀歸兘涓嶈錛屽垯緇撴灉涓?1銆?br />
榪欏氨鏄湡姝g殑DP浜嗐傝F[i][j]涓哄墠i浣嶏紝鍒拌揪鐨勭粨鐐逛負j錛屾渶灝戞敼鍔ㄧ殑瀛楃涓暟錛屽垯杞Щ鏂圭▼涓?br />F[i][j] = min{F[i-1][x] + (A[i] != c)}錛宑∈{'A', 'C', 'G', 'T'}錛孲[x][c]=j銆傝竟鐣岋細F[0][root]=0錛屽叾浣欑殑F[0][]=+∞錛孉鐨勫疄闄呬笅鏍囦粠1寮濮嬨?br />姹係鏁扮粍鐨勬柟娉曡銆愪緥2銆?br />
浠g爜
銆愪緥4銆?a title="PKU3208" >PKU3208
棰樻剰錛氬惈鏈夎繛緇殑涓変釜鏁板瓧6鐨勬鏁存暟錛岀О涓?beastly number"錛屾眰絎琍涓紙1<=P<=50000000錛?beastly number"錛堝叾浣嶆暟涓嶄細瓚呰繃15浣嶏級銆?br />錛堣繖棰樻槸鏈矙鑼跺湪PKU涓婅嚦浠婁負姝紝鑷繁鎯沖嚭綆楁硶鐨凙C浜烘暟鏈灝戠殑棰橈級
鏈鍏跺疄鏄敤涓嶇潃KMP鐨勶紝鍥犱負"666"榪欐牱綆鍗曠殑瀛愪覆……
鎬濊礬錛氱敱浜庝綅鏁頒笉浼氳秴榪?5浣嶏紙鍚庢潵鍙戠幇鏈澶氬彧鏈?0浣嶏級錛屾墍浠ユ瘡涓?beastly number"閮藉彲浠ョ湅鎴愪竴涓暱搴︿負15錛屽瓧絎﹂泦涓篬'0'..'9']鐨勫瓧絎︿覆錛堟敞鎰忔槸鍙互鏈夊墠瀵?鐨勶紝鍥犱負浣嶆暟鍙兘涓嶈凍15浣嶏級A錛屾暣涓繃紼嬩篃灝辨槸浠庨珮浣嶏紙絎?浣嶏級鍚戜綆浣嶏紙絎?4浣嶏級姹傚嚭A鐨勫悇浣嶃?br />
棰勫鐞嗭細姹傚嚭F[i][j]錛岃〃紺鴻嫢A鐨勫墠i浣嶅凡緇忕‘瀹氾紙鍏朵腑涓嶅惈"666"錛屽噯紜潵璇存槸闈炴湯灝句笉鍚?666"錛夛紝涓斿墠i浣嶇殑鏈熬鍒氬ソ鏈塲涓?6'錛坖鐨勮寖鍥存槸0鍒?錛夋椂錛屾湁澶氬皯涓?beastly number"錛堟敞鎰忥紝鍓峣浣嶆棦鐒跺凡緇忕‘瀹氾紝灝變笉鍙洿鏀逛簡錛岃兘澶熷喅瀹氱殑鍙湁絎琲浣嶇殑鍚庨潰錛夈?br />鏄劇劧鍏堣姹傚嚭F0[i][j]琛ㄧず鏈夊灝戜釜涓嶆槸"beastly number"銆傚叾閫掓帹鏂圭▼涓嶅ソ鍐欙紝瑙佷唬鐮侊紙鍏跺疄涔熸槸寰堝ソ鐞嗚В鐨勶級銆傜劧鍚嶧[i][j]=1014-i - F0[i][j]銆?br />
鐒跺悗灝辨槸涓嶆柇璋冩暣杈圭晫鏉ユ瀯閫犱簡銆傚噯紜潵璇達紝璁懼墠i-1浣嶅凡緇忕‘瀹氾紝鐜板湪瑕佺‘瀹氱i浣嶏紝鍒欐灇涓劇i浣嶆槸0~9涓殑鍝釜鍊鹼紝鐒跺悗姹傚嚭婊¤凍鏉′歡鐨勬渶灝忕殑"beastly number"鍜屾渶澶х殑"beastly number"鐨勫悕嬈★紙娉ㄦ剰錛屽悕嬈℃槸浠?寮濮嬬殑錛夛紝鐪嬬湅P鍦ㄤ笉鍦ㄥ叾涓紝榪欐牱灝辮兘紜畾浜嗐備弗閲嶆敞鎰忥細濡傛灉宸茬‘瀹氱殑浣嶆暟涓凡緇忓嚭鐜頒簡"666"錛屾帴涓嬫潵鐨勫氨涓嶇敤鏋氫婦浜嗭紝鐩存帴鍦ㄥ悗闈㈡帴涓奝-L灝辮浜嗭紝L涓哄乏杈圭晫銆?br />
浣嗘槸錛屼負浠涔堣鎶婃湰棰樻斁鍦↘MP鐨勪笓棰橀噷闈㈠憿鍥э紵鍥犱負濡傛灉榪欎釜瀛愪覆涓嶆槸"666"鑰屾槸涓浜涚粨鏋勫鏉傜殑涓滀笢姣斿"123131"榪欐牱鐨勶紝鍙湁鍊熷姪KMP綆楁硶浜嗐傝繖鏃訛紝F[i][j]灝辮〃紺?A鐨勫墠i浣嶅凡緇忕‘瀹氾紙闈炴湯灝句笉鍚繖涓瓙涓詫級錛屼笖鍏跺悗緙涓庤繖涓瓙涓茬殑鍓嶇紑鍖?/span>閰嶉暱搴︿負j錛?/span>鏈夊灝戜釜"beastly number" 錛岃漿縐繪柟紼嬩笌鍓嶅嚑涓緥瀛愮被浼箋?br />
浠g爜
鎬葷粨錛?br />KMP綆楁硶鍜孉C鑷姩鏈虹殑鐘舵佽漿縐繪ц川鍐沖畾浜嗗畠浠湪瀛楃涓插尮閰嶇被DP闂涓殑宸ㄥぇ浣滅敤銆傚湪瀹為檯搴旂敤涓紝瑕佹敞鎰忕伒媧諱嬌鐢ㄥ畠浠傛澶栵紝AC鑷姩鏈虹殑閭d釜BUG鏄竴瀹氳娉ㄦ剰鐨勩?
]]>
銆?銆戜竴浜涘畾涔夛細
瀛楃涓詫細騫夸箟鐨勫瓧絎︿覆鏄寚“鍏冪礌綾誨瀷鏈夊簭錛屼笖鍏冪礌鍊兼湁涓瀹氳寖鍥寸殑搴忓垪”錛屽叾鍏冪礌涓嶄竴瀹氶潪瑕佹槸瀛楃錛屽彲浠ユ槸鏁板瓧絳夛紝鍥犳鏁存暟銆佷簩榪涘埗鏁扮瓑涔熸槸瀛楃涓詫紱
瀛楃闆嗭細瀛楃涓茬殑鍏冪礌鍊肩殑鑼冨洿縐頒負瀛楃闆嗭紝鍏跺ぇ灝忚涓篠Z銆?br />瀛楃涓茬殑闀垮害錛氬瓧絎︿覆涓厓绱犵殑涓暟錛屼竴鑸涓篘錛岄暱搴︿負N鐨勫瓧絎︿覆A絎竴嬈℃彁鍒版椂涓鑸敤A[0..N-1]鏉ヨ〃紺猴紱
鍓嶇紑錛氬瓧絎︿覆A[0..N-1]鐨勪粠A[0]寮濮嬬殑鑻ュ共涓繛緇殑瀛楃緇勬垚鐨勫瓧絎︿覆縐頒負A鐨勫墠緙錛屼互涓?#8220;鍓嶇紑i”鎴栬?#8220;緙栧彿涓篿鐨勫墠緙”鎸囩殑閮芥槸A[0..i]錛?br />鍚庣紑錛氬瓧絎︿覆A[0..N-1]鐨勫埌A[N-1]緇堟鐨勮嫢騫蹭釜榪炵畫鐨勫瓧絎︾粍鎴愮殑瀛楃涓茬О涓篈鐨勫悗緙錛屼互涓?#8220;鍚庣紑i”鎴栬?#8220;緙栧彿涓篿鐨勫悗緙”鎸囩殑閮芥槸A[i..N-1];
瀵逛簬涓涓暱搴︿負N鐨勫瓧絎︿覆錛屽皢鍏禢涓悗緙鎸夊瓧鍏稿簭澶у皬榪涜鎺掑簭錛屽緱鍒頒袱涓暟緇剆a[i]鍜宺ank[i]錛宻a[i]涓烘帓鍦ㄧi浣嶇殑鍚庣紑鐨勭紪鍙鳳紙涔熷氨鏄竴鑸鐨刼rd[i]錛夛紝rank[i]涓烘帓鍦ㄥ悗緙i鎺掑湪鐨勪綅緗紙縐頒負鍚庣紑i鐨勫悕嬈★級銆俿a銆乺ank鍊肩殑鑼冨洿鍧囦負[0..N-1]銆俿a鍜宺ank浜掗嗭紝鍗硈a[i]=j絳変環浜巖ank[j]=i錛屾垨鑰呰鎴恠a[rank[i]]=rank[sa[i]]=i銆傝繖閲岋紝sa縐頒負鍚庣紑鏁扮粍錛宺ank縐頒負鍚嶆鏁扮粍銆?br />
銆?銆戠敤鍊嶅綆楁硶姹傚悗緙鏁扮粍錛?br />鍦ㄨ鏂囬噷錛屽悗緙鏁扮粍鏈変袱縐嶆眰娉曪細鍊嶅綆楁硶鍜孌C3綆楁硶錛屽墠鑰呯殑鏃墮棿澶嶆潅搴︿負O(NlogN)錛屼絾甯告暟杈冨皬錛屽悗鑰呯殑鏃墮棿澶嶆潅搴︿負O(N)錛屼絾甯告暟杈冨ぇ錛屽湪瀹為檯搴旂敤涓紝涓よ呯殑鎬繪椂闂寸浉宸笉澶э紝涓斿悗鑰呮瘮鍓嶈呴毦鐞嗚В寰楀錛堟湰娌欒尪鐞嗚В鍓嶈呴兘鐢ㄤ簡鍑犲ぉ鏃墮棿……鍚庤呭氨鏈ㄦ暍鐪嬩簡錛夈傝繖閲屽氨鎬葷粨涓涓嬪嶅綆楁硶鍚у洤……
棣栧厛錛岃創涓涓嬫湰娌欒尪鐨勭敤鍊嶅綆楁硶姹傚悗緙鏁扮粍鐨勬ā鏉匡細
{
int p, v0, v1, v00, v01;
re(i, SZ) S[i] = 0;
re(i, n) rank[i] = A[i];
re(i, n) S[A[i]]++;
re2(i, 1, SZ) S[i] += S[i - 1];
rre(i, n) sa[--S[A[i]]] = i;
for (int j=1; j<n; j<<=1) {
p = 0; re2(i, n-j, n) tmp[p++] = i;
re(i, n) if (sa[i] >= j) tmp[p++] = sa[i] - j;
re(i, SZ) S[i] = 0;
re(i, n) S[rank[i]]++;
re2(i, 1, SZ) S[i] += S[i - 1];
rre(i, n) sa[--S[rank[tmp[i]]]] = tmp[i];
tmp[sa[0]] = p = 0;
re2(i, 1, n) {
v0 = sa[i - 1]; v1 = sa[i];
if (v0 + j < n) v00 = rank[v0 + j]; else v00 = -1;
if (v1 + j < n) v01 = rank[v1 + j]; else v01 = -1;
if (rank[v0] == rank[v1] && v00 == v01) tmp[sa[i]] = p; else tmp[sa[i]] = ++p;
}
re(i, n) rank[i] = tmp[i];
SZ = ++p;
}
}
<1>鍊嶅綆楁硶鐨勬濇兂錛?br />璁癛[i][j]涓篈[i..i+2j-1]錛堝鏋滆秺鐣岋紝鍒欏悗闈㈢敤@濉厖錛夊湪A鐨勬墍鏈夐暱搴︿負2j鐨勫瓙涓詫紙瓚婄晫鍒欏悗闈㈢敤@濉厖錛変腑鐨勫悕嬈★紙rank錛夊箋傚嶅綆楁硶灝辨槸鎸夐樁孌墊眰鍑烘墍鏈塕[i][j]鐨勫鹼紝鐩村埌2j>N涓烘銆傞鍏堬紝R[i][0]鐨勫氨鏄瓧絎[i]鍦ˋ[0..N-1]涓殑鍚嶆錛屾槸鍙互鐩存帴鐢ㄨ鏁版帓搴忔潵瀹炵幇鐨勩傜劧鍚庯紝鑻[0..N-1][j-1]宸茬煡錛屽垯鍙互鎸夌収浠ヤ笅鏂規硶姹傚嚭R[0..N-1][j]鐨勫鹼細瀵規瘡涓猧錛?<=i<N錛夛紝鏋勯犱竴涓簩鍏冪粍<Xi, Yi>錛屽叾涓璛i=R[i][j-1]錛孻i=R[i+2j][j-1]錛堣嫢i+2j>=N錛屽垯Yi=-∞錛夛紝鐒跺悗瀵硅繖N涓簩鍏冪粍鎸夌収絎竴鍏抽敭瀛椾負X錛岀浜屽叧閿瓧涓篩錛堣嫢涓よ呴兘鐩哥瓑鍒欏垽瀹氫負鐩哥瓑錛夎繘琛屾帓搴忥紙鍙互鐢ㄥ熀鏁版帓搴忔潵瀹炵幇錛夛紝鎺掑簭鍚庯紝<Xi, Yi>鐨勫悕嬈″氨鏄殑R[i][j]鐨勫箋?br />
<2>涓寮濮嬶紝瀵笰涓殑鍚勪釜瀛楃榪涜璁℃暟鎺掑簭錛?
re(i, n) rank[i] = A[i];
re(i, n) S[A[i]]++;
re2(i, 1, SZ) S[i] += S[i - 1];
rre(i, n) sa[--S[A[i]]] = i;
<3>j錛堜唬鏇?j錛夌殑鍊間粠1寮濮嬩笉鏂嶅錛屽浜屽厓緇勮繘琛屽熀鏁版帓搴忔眰鍑烘柊闃舵鐨剆a鍊鹼細
p = 0; re2(i, n-j, n) tmp[p++] = i;
re(i, n) if (sa[i] >= j) tmp[p++] = sa[i] - j;
re(i, SZ) S[i] = 0;
re(i, n) S[rank[i]]++;
re2(i, 1, SZ) S[i] += S[i - 1];
rre(i, n) sa[--S[rank[tmp[i]]]] = tmp[i];
<4>姹傚嚭鏂伴樁孌電殑rank鍊鹼細
re2(i, 1, n) {
v0 = sa[i - 1]; v1 = sa[i];
if (v0 + j < n) v00 = rank[v0 + j]; else v00 = -1;
if (v1 + j < n) v01 = rank[v1 + j]; else v01 = -1;
if (rank[v0] == rank[v1] && v00 == v01) tmp[sa[i]] = p; else tmp[sa[i]] = ++p;
}
re(i, n) rank[i] = tmp[i];
SZ = ++p;
鍥犱負sa鍊煎凡緇忔眰鍑猴紝鍥犳鍙渚濇鎵弿sa灝卞彲浠ュ緱鍒皉ank鍊鹼紝鍞竴瑕佸仛鐨勫伐浣滃氨鏄壘鍒板摢浜涘瓙涓叉槸鐩哥瓑鐨勶紝瀹冧滑鐨剅ank鍊煎簲璇ョ浉絳夛紝闄ゆ涔嬪錛宺ank鍊煎彧瑕佷緷嬈″姞1鍗沖彲銆傚垽瀹氱浉絳夌殑鏂規硶錛氬彧闇鍒ゅ畾rank[i]鍜宺ank[i+j]鏄惁閮藉搴旂浉絳夊嵆鍙傝嫢rank[i+j]瓚婄晫錛岀敤-∞錛堝綋鐒朵換浣曚竴涓礋鏁伴兘琛岋紝浠g爜涓敤浜?1錛夋潵琛ㄧず銆?br />鏈鍚庤繕鏈変竴涓紭鍖栵細鐢變簬鏈樁孌電殑鍚嶆鐨勮寖鍥村彧鏈塠0..p]榪欎箞澶氾紝涓嬩竴闃舵鐨?#8220;瀛楃闆?#8221;錛堝叾瀹炲氨鏄痳ank闆嗭級鐨勫ぇ灝廠Z鍙互璁句負p+1錛岃繖鏍峰彲浠ョ渷涓浜涙椂闂淬?br />
榪欐牱鍚庣紑鏁扮粍sa鍜屽悕嬈℃暟緇剅ank灝卞叏閮ㄦ眰瀹屼簡銆?br />
浠ュ悗榪樻湁涓浜涙洿閲嶈鐨勪笢涓滃氨鏄疉C鑷姩鏈恒佸悗緙鏁扮粍絳夌殑搴旂敤闂錛岀畻浜嗭紝浠ュ悗鍐嶆悶鍚у洤銆?br />
]]>
鎴戠湡鏄お娌欒尪浜?#8230;…榪欎箞姘寸殑棰樼洰璋冧簡N涔咃紝鎵句簡N浣嶇鐘囧府鎴戠湅浠g爜錛屾渶緇堟墠鎵懼嚭鏉UG……
鏄撶柕鐐癸細
錛?錛夋湰棰樼殑瀛愪覆鏄彲浠ョ浉鍚岀殑錛屾鏃禩rie鐨勬瘡涓粨鐐硅璁句竴涓猰ul鍊鹼紝琛ㄧず璇ョ粨鐐瑰搴旂殑瀛楃涓插湪鎵鏈夊瓙涓蹭腑閲嶅鐨勬鏁幫紝鍙﹀錛?span style="color: red">涓嶈涓轟簡鐪佺┖闂存妸mul瀹氫箟鎴恈har鍨嬶紝鏈夊彲鑳芥墍鏈夌殑瀛楃涓插叏鐩稿悓錛屽洜姝ら渶瑕佸畾涔夋垚int錛堜簨瀹炶瘉鏄庝笉浼氱垎絀洪棿錛夛紝榪欐槸鏈矙鑼惰鎶樼(浜嗚繖涔堜箙鐨勪富瑕佸師鍥?/strong>錛?br />錛?錛塗rie閲囩敤闈欐佸瓨鍌紝0鍙風粨鐐逛綔涓虹┖緇撶偣錛圢ULL錛夛紝鍥犳鐪熸鐨勭粨鐐圭紪鍙蜂粠1寮濮嬶紝鍙﹀root涓鑸兘鏄?鍙風粨鐐癸紱
錛?錛夋敞鎰忓湪寤虹珛鑷姩鏈轟互鍙婂尮閰嶇殑鏃跺欙紝鎵鏈夎娌縡ail涓婃函鐨勫湴鏂癸紝鍏惰竟鐣岄兘鏄?錛圢ULL錛屾敞鎰忎笉鏄痳oot錛夋垨鑰呮壘鍒頒竴涓湁瀵瑰簲瀛愮粨鐐圭殑緇撶偣銆傛敞鎰忓埌0榪樻病鏈夋壘鍒扮殑澶勭悊鏂規硶錛氬湪寤虹珛鑷姩鏈虹殑鏃跺欙紝灝員[j]緗負root錛涘湪鍖歸厤鐨勬椂鍊欙紝灝唜緗負root錛?br />
浠g爜錛堟ā鏉匡級錛堥偅浜涙爣浜咥ttention鐨勫湴鏂歸兘鏄槗鐤電殑錛夛細
#include <stdio.h>
#include <string>
using namespace std;
using std::string;
#define re(i, n) for (int i=0; i<n; i++)
#define root 1
const int MAXN = 500001, MAXLEN = 1000001, SZ = 26, INF = ~0U >> 2;
struct node {
int mul, ch[SZ], fail; //Attention
} T[MAXN];
int N, Q[MAXN], res;
string s0, A;
char tmp[MAXLEN], tmp0[51];
void ins()
{
int len = s0.length(), x = root, c;
re(i, len) {
c = s0[i] - 97;
if (!T[x].ch[c]) {T[x].ch[c] = ++N; T[N].mul = 0; re(j, SZ) T[N].ch[j] = 0;}
x = T[x].ch[c];
}
T[x].mul++;
}
void mkf()
{
Q[0] = root; T[root].fail = 0;
int i, j, x;
for (int front=0, rear=0; front<=rear; front++) {
i = Q[front];
re(k, SZ) if (j = T[i].ch[k]) {
x = T[i].fail;
while (x && !T[x].ch[k]) x = T[x].fail; //Attention
if (x) T[j].fail = T[x].ch[k]; else T[j].fail = root; //Attention
Q[++rear] = j;
}
}
}
void solve()
{
int len = A.length(), x = root, y, c; res = 0;
re(i, len) {
c = A[i] - 97;
while (x && !T[x].ch[c]) x = T[x].fail; //Attention
if (!x) x = root; else x = T[x].ch[c]; //Attention
y = x;
while (y) {res += T[y].mul; T[y].mul = 0; y = T[y].fail;} //Attention
}
}
int main()
{
int tests, n;
scanf("%d", &tests);
re(testno, tests) {
N = 1; T[root].mul = 0; re(i, SZ) T[root].ch[i] = 0;
scanf("%d", &n); getchar();
re(i, n) {
gets(tmp0);
s0 = tmp0;
ins();
}
gets(tmp);
A = tmp;
mkf();
solve();
printf("%d\n", res);
}
return 0;
}
銆?011騫?0鏈?9鏃ャ戜粖澶╁彂鐜頒簡鍖歸厤榪囩▼涓殑涓涓彲浼樺寲鐨勫湴鏂癸細瀵逛簬涓涓偣x浠ュ強瀹冪殑鎵鏈夎繑鍥炵粨鐐癸紙榪欓噷鎶婃墍鏈夋部鐫x鐨勫け璐ユ寚閽堜笉鏂笂婧洿鍒皉oot璺緞涓婄殑緇撶偣閮界О涓鴻繑鍥炵粨鐐癸級錛岀敱浜庝笉鍙噸澶嶈鏁幫紝鍙互灝嗗畠浠殑mul鍊肩疆涓哄師鏉ul鍊肩殑鐩稿弽鏁幫紙-mul錛夛紝鑰屼笉鏄?錛岃〃紺鴻緇撶偣宸茬粡緇熻榪囥傝繖鏍峰湪涓嬩竴嬈鐨勪笂婧繃紼嬩腑涓鏃﹀彂鐜頒竴涓猰ul鍊間負璐熺殑鐐瑰氨涓嶇敤緇х畫涓婃函浜嗭紝鍥犱負涓婇潰鐨勭偣涓瀹氫篃宸茬粡緇熻榪囦簡銆?br />褰撶劧錛岃繖浠呴檺浜庡崟涓諱覆錛屽鏋滄槸澶氫富涓插垯闇瑕佸湪姣忔鍖歸厤涔嬪墠鎶奣rie鏍戜腑鎵鏈夌粨鐐圭殑mul鍊鹼紙濡傛灉鏄礋鏁扮殑鐨勮瘽錛夊叏閮ㄩ噸鏂板彇鍙嶃備負浜嗚妭鐪佹椂闂達紝鍙互鍦ㄥ尮閰嶈繃紼嬩腑鎶婃墍鏈夌粺璁¤繃鐨勶紙mul鍊兼敼涓鴻礋鏁扮殑錛夌粨鐐瑰叏閮ㄦ斁榪涗竴涓緟鍔╃殑闃熷垪閲岋紝鐒跺悗鍙栧弽鏃跺彧瑕佸鐞嗛槦鍒椾腑鐨勭粨鐐瑰氨琛屼簡銆?br />
鍔犲叆璇ヤ紭鍖栧悗鐨勪唬鐮侊紙solve閮ㄥ垎錛夛細
{
int len = A.length(), x = root, y, c; res = 0;
re(i, len) {
c = A[i] - 97;
while (x && !T[x].ch[c]) x = T[x].fail;
if (!x) x = root; else x = T[x].ch[c];
y = x;
while (y && T[y].mul >= 0) {res += T[y].mul; T[y].mul = -T[y].mul; y = T[y].fail;}
}
}
涓嬮潰鏄紭鍖栫殑瀹炴祴緇撴灉錛堢涓涓負浼樺寲鍚庣殑錛岀浜屼釜涓轟紭鍖栧墠鐨勶級錛屽彲浠ョ湅鍑猴紝璇ヤ紭鍖栫殑鍔涘害寰堝ぇ銆?img height="48" alt="" src="http://www.shnenglu.com/images/cppblog_com/matono1/嫻嬭瘎緇撴灉/ACauto.gif" width="564" border="0" longdesc="" />
]]>
銆怱ample Output銆?br>10
錛堜粠絎?0浣嶆柇寮鍚庡緱鍒扮殑瀛楃涓?aamandamand"鐨勫瓧鍏稿簭鏄?1涓柇寮浣嶇疆涓渶灝忕殑錛?br>
銆愬垎鏋愩?br>棣栧厛灝嗚繖涓幆褰覆鎷嗗紑錛氬彧闇灝哠[0..N-1]鐨勫悗闈㈠啀鎺ヤ笂S[0..N-2]鍗沖彲錛堝瀵逛簬鏍蜂緥錛屽彲鏋勯犲瓧絎︿覆T = "amandamandaamandamand"錛夛紝鍒橳鐨勪換鎰忎竴涓暱搴︿負N鐨勫瓙涓睺[i..i-N+1]灝辨槸S浠庣i浣嶆柇寮寰楀埌鐨勫瓧絎︿覆銆傛鏃墮棶棰樺氨鍙樻垚浜嗭細緇欏嚭涓涓暱搴︿負(2N-1)鐨勫瓧絎︿覆錛屾眰鍑哄叾鎵鏈夐暱搴︿負N鐨勫瓙涓蹭腑瀛楀吀搴忔渶灝忕殑銆?br>
璁綟[x]涓?span style="COLOR: red">T涓墍鏈夎搗濮嬩綅灝忎簬N鐨勯暱搴︿負x鐨勫瓙涓蹭腑瀛楀吀搴忔渶灝忕殑瀛愪覆鐨勮搗濮嬩綅錛堣嫢鏈夊涓垯鍙栨渶宸﹁竟鐨勶級錛屽瀵逛簬T="abaabaaababaabaaa"錛屾湁F[0]=F[1]=0錛孎[2]=2錛孎[3]=F[4]=5……鏈鐨勭洰鐨勫氨鏄眰鍑篎[N]鐨勫箋備竴寮濮嬪凡鐭ョ殑鍙湁F[0]=0錛堥暱搴︿負0鐨勫瓧絎︿覆閮芥槸絀轟覆錛屽瓧鍏稿簭閮芥槸鏈灝忕殑錛屽彇鏈宸﹁竟鐨勭0浣嶏級銆?br>
鍙互鍙戠幇錛孎鏁扮粍鏈夊緢澶氶噸瑕佺殑鎬ц川錛?br>鎬ц川1 F[0..N]鏁扮粍鏄崟璋冮掑鐨勩?/strong>
璇佹槑錛氱敤鍙嶈瘉娉曘傝瀛樺湪涓涓紉(0<=x<N)浣垮緱F[x]>F[x+1]鍒欐牴鎹畾涔夛紝鏈塗[F[x+1]..F[x+1]+x]<=T[F[x]..F[x]+x]錛堣繖閲屼竴瀹氫笉浼氳秺鐣岋紝鍗矲[x]+x鐨勫間竴瀹氫笉澶т簬(2N-1)錛屽洜涓簒<N錛屽張鏍規嵁寰桭[x]<N錛屾晠F[x]+x<2N錛夛紝榪欐牱錛屽繀鏈塗[F[x+1]..F[x+1]+x-1]<=T[F[x]..F[x]+x-1]銆傜劧鑰屾牴鎹瓼[x]鐨勫畾涔夊張鍙互寰楀埌T[F[x+1]..F[x+1]+x-1]>T[F[x]..F[x]+x-1]錛堝惁鍒橣[x]鐨勫煎氨搴旇絳変簬F[x+1]鐨勫間簡錛夛紝鐭涚浘錛屾晠鍦‵[0..N]涓笉鍙兘瀛樺湪浠諱綍F[x]>F[x+1]鐨勬儏鍐碉紝涔熷嵆F[0..N]鏁扮粍鏄崟璋冮掑鐨勶紙浠ヤ笅灝咶[0..N]鏁扮粍綆縐頒負F鏁扮粍錛夈?br>鎬ц川2 瀵逛簬浠繪剰鍊紉(0<=x<N)錛屽繀鐒舵弧瓚矲[x+1]=F[x]鎴朏[x+1]>F[x]+x銆?/strong>
璇佹槑錛氬洜涓哄墠闈㈠凡緇忚瘉鏄庝簡F鏁扮粍鏄崟璋冮掑鐨勶紝榪欓噷鍙渶璇佹槑瀵逛簬浠繪剰x(0<=x<N)錛屼笉瀛楩[x]<F[x+1]<=F[x]+x鐨勬儏鍐靛嵆鍙?br>榪欓噷鍚屾牱鐢ㄥ弽璇佹硶銆傝瀛樺湪涓涓紉(0<=x<N)浣垮緱F[x]<F[x+1]<=F[x]+x銆傚垯鏍規嵁瀹氫箟鏈塗[F[x+1]..F[x+1]+x]<T[F[x]..F[x]+x]涓擳[F[x]..F[x]+x-1]<=T[F[x+1]..F[x+1]+x-1]錛岃繖鏍峰繀鏈塗[F[x]..F[x]+x-1]=T[F[x+1]..F[x+1]+x-1]涓擳[F[x+1]+x]<T[F[x]+x]銆傝D=F[x+1]-F[x]錛屽垯T[F[x]]=T[F[x]+D]錛屽洜涓篋<=x錛屽彲寰桾[F[x]+D]=T[F[x]+2D]錛屽嵆T[F[x]]=T[F[x]+2D]銆傝繖鏍鳳紝T[F[x]..F[x]+x-D-1]=T[F[x]+2D..F[x]+x+D-1]錛涘張鍥犱負T[F[x]+x-D]=T[F[x]+x]錛岃孴[F[x+1]+x]錛堝嵆T[F[x]+x+D]]錛?lt;T[F[x]+x]錛岃繖鏍鳳紝T[F[x]+x+D]<T[F[x]+x-D]錛屼篃灝辨槸錛孴[F[x]+2D..F[x]+x+D]<T[F[x]..F[x]+x-D]錛佽繖鏍峰彲浠ュ緱鍑猴紝浠?F[x]+2D)浣嶅紑濮嬬殑浠繪剰闀垮害涓嶅皬浜?x-D)鐨勫瓙涓詫紝鍏跺瓧鍏稿簭閮藉皬浜庝粠F[x]浣嶅紑濮嬬殑鍚屾牱闀垮害鐨勫瓙涓詫紝鐢變簬F[x]<F[x+1]<=F[x]+x錛孌=F[x+1]-F[x]錛屾墍浠ユ湁1<=D<=x錛岃繖鏍鳳紝F[x]鐨勫煎氨搴旇鏄?F[x]+2D)浜嗭紝榪欐樉鐒朵笉鍙兘銆傛墍浠ワ紝涓寮濮嬪亣璁劇殑榪欑鎯呭喌鏄笉鍙兘瀛樺湪鐨勶紝鍗沖浜庝換鎰忓紉錛?<=x<N錛夛紝蹇呯劧婊¤凍F[x+1]=F[x]鎴朏[x+1]>F[x]+x銆?br>
鏍規嵁F鏁扮粍鐨勪互涓婁袱涓ц川鍙互璁捐鍑烘湰棰樼殑綆楁硶錛?br>璁劇洰鍓嶅凡緇忔眰鍑轟簡F[0..x-1]鐨勫鹼紝涓擣[x-1]=i銆傞鍏堝皢T[0..i-1]鍏ㄩ儴鍒犲幓錛堝洜涓篎鏁扮粍鏄崟璋冮掑鐨勶紝F[x]鐨勫間竴瀹氫笉灝忎簬i錛夛紝鐒跺悗瀵筎鑷韓浣滄墿灞昁MP錛堝氨鏄互T涓烘ā鏉夸覆錛孴涓哄瓙涓茬殑鎵╁睍KMP錛岀浉褰撲簬鍏墮澶勭悊閮ㄥ垎錛夛紝涓寮濮嬪厛灝咶[x]緗負i錛岃絎琷浣嶇殑鍖歸厤闀垮害涓簄ext[j]錛岃嫢next[j]=x-1涓擳[j+x-1]<T[i+x-1]錛屽垯灝咶[x]鐨勫兼敼涓簀錛岃繖鏍鋒壂鎻忎竴閬嶏紝鍗蟲眰鍑轟簡F[x]鐨勫箋傝嫢鎵弿榪囩▼涓湭鍑虹幇浠諱綍next[j]=x-1錛屽垯璁炬墍鏈塶ext[j]鍊間笉灝忎簬x鐨勬渶灝弉ext[j]鍊間負y錛屽垯鍙互鐩存帴寰楀埌F[x..y-1]鐨勫煎潎絳変簬F[x-1]銆傚氨榪欐牱鐩村埌姹傚嚭F[N]鐨勫間負姝€?br>
鏃墮棿澶嶆潅搴︼細O(NÖN)錛屽彲浠ユ牴鎹ц川2寰楀埌銆?
]]>
next[0] = lenB;
int j = 0;
re2(i, 1, lenB) {
while (j && B[i] != B[j]) j = next[j - 1];
if (B[i] == B[j]) j++;
next[i] = j;
}
j = 0;
re(i, lenA) {
while (j && A[i] != B[j]) j = next[j - 1];
if (A[i] == B[j]) j++;
ex[i] = j;
}
錛?錛塱-k+L-1<p-k錛屽嵆i+L<=p銆傝繖鏃訛紝鐢盇[i..p]==B[i-k..p-k]鍙互寰楀埌A[i..i+L-1]==B[i-k..i-k+L-1]錛屽張鍥犱負B[0..L-1]==B[i-k..i-k+L-1]鎵浠[i..i+L-1]==B[0..L-1]錛岃繖灝辮鏄巈x[i]>=L銆傚張鐢變簬next鐨勫畾涔夊彲寰楋紝A[i+L]蹇呯劧涓嶇瓑浜嶣[L]錛堝惁鍒橝[i..i+L]==B[0..L]錛屽洜涓篿+L<=p錛屾墍浠[i..i+L]==B[i-k..i-k+L]錛岃繖鏍稡[0..L]==B[i-k..i-k+L]錛屾晠next[i-k]鐨勫煎簲涓篖+1鎴栨洿澶э級錛岃繖鏍鳳紝鍙互鐩存帴寰楀埌ex[i]=L錛?/strong>
錛?錛塱+k-L+1>=p-k錛屽嵆i+L>p銆傝繖鏃訛紝棣栧厛鍙互鐭ラ亾A[i..p]鍜孊[0..p-i]鏄浉絳夌殑錛堝洜涓篈[i..p]==B[i-k..p-k]錛岃宨+k-L+1>=p-k錛岀敱B[0..L-1]==B[i-k..i-k+L-1]鍙緱B[0..p-i]==B[i-k..p-k]錛屽嵆A[i..p]==B[0..p-i]錛夛紝鐒跺悗錛屽浜嶢[p+1]鍜孊[p-i+1]鏄惁鐩哥瓑錛岀洰鍓嶆槸涓嶇煡閬撶殑錛堝洜涓哄墠闈㈠凡緇忚榪囷紝p鏄洰鍓岮涓蹭腑鍖歸厤鍒扮殑鏈榪滀綅緗紝鍦╬涔嬪悗鏃犳硶鐭ラ亾浠諱綍涓浣嶇殑鍖歸厤淇℃伅錛夛紝鍥犳錛岃浠嶢[p+1]涓嶣[p-i+1]寮濮嬪線鍚庣戶緇尮閰嶏紙璁緅涓虹洰鍓岯鐨勫尮閰嶄綅緗殑涓嬫爣錛屼竴寮濮媕=p-i+1錛屾瘡嬈℃瘮杈傾[i+j]涓嶣[j]鏄惁鐩哥瓑錛岀洿鍒頒笉鐩哥瓑鎴栬呰秺鐣屼負姝紝姝ゆ椂鐨刯鍊煎氨鏄痚x[i]鐨勫鹼級銆傚湪榪欑鎯呭喌涓嬶紝p鐨勫煎繀鐒朵細寰楀埌寤朵幾錛屽洜姝ゆ洿鏂発鍜宲鐨勫箋?br />杈圭晫錛歟x[0]鐨勫奸渶瑕侀鍏堟眰鍑猴紝鐒跺悗灝嗗垵濮嬬殑k璁句負0錛宲璁句負ex[0]-1銆?br />瀵逛簬姹俷ext鏁扮粍錛屼篃鏄?#8220;鑷韓鍖歸厤”錛岀被浼糑MP鐨勬柟娉曞鐞嗗嵆鍙傚敮涓鐨勪笉鍚岀偣涔熷湪杈圭晫涓婏細鍙互鐩存帴鐭ラ亾next[0]=lenB錛宯ext[1]鐨勫奸鍏堟眰鍑猴紝鐒跺悗鍒濆k=1錛宲=ex[1]銆?br />
闇瑕佷弗閲嶆敞鎰忕殑鏄紝鍦ㄤ笂榪扮殑鎯呭喌錛?錛変腑錛屾湰璇ヤ粠A[p+1]涓嶣[p-i+1]寮濮嬪尮閰嶏紝浣嗘槸錛岃嫢p+1<i錛屼篃灝辨槸p-i+1<0錛堣繖縐嶆儏鍐墊槸鏈夊彲鑳藉彂鐢熺殑錛屽綋ex[i-1]=0錛屼笖鍓嶉潰鐨別x鍊奸兘娌℃湁寤朵幾鍒癷鍙婁互鍚庣殑鏃跺欙級鐨勮瘽錛岄渶瑕佸皢A銆丅鐨勪笅鏍囬兘鍔?錛堝洜涓烘鏃秔蹇呯劧絳変簬i-2錛屽鏋淎銆丅鐨勪笅鏍囩敤涓や釜鍙橀噺x銆亂鎺у埗鐨勮瘽錛寈鍜寉閮借鍔?錛夛紒錛?/span>
銆愭牳蹇冧唬鐮併?br />
next[0] = lenB; next[1] = lenB - 1;
re(i, lenB-1) if (B[i] != B[i + 1]) {next[1] = i; break;}
int j, k = 1, p, L;
re2(i, 2, lenB) {
p = k + next[k] - 1; L = next[i - k];
if (i + L <= p) next[i] = L; else {
j = p - i + 1;
if (j < 0) j = 0;
while (i + j < lenB && B[i + j] == B[j]) j++;
next[i] = j; k = i;
}
}
int minlen = lenA <= lenB ? lenA : lenB; ex[0] = minlen;
re(i, minlen) if (A[i] != B[i]) {ex[0] = i; break;}
k = 0;
re2(i, 1, lenA) {
p = k + ex[k] - 1; L = next[i - k];
if (i + L <= p) ex[i] = L; else {
j = p - i + 1;
if (j < 0) j = 0;
while (i + j < lenA && j < lenB && A[i + j] == B[j]) j++;
ex[i] = j; k = i;
}
}
]]>