week2day3筆記 字串初步

2021-09-25 23:23:39 字數 1759 閱讀 9332

kmp

kmp用於快速匹配字串,查出乙個串在另乙個串**現的位置及次數。

kmp的核心是失配陣列的構建以及應用。

失配陣列:習慣命名為next,next[i]中儲存資訊含義是: 字串前i位構成的字串中,若存在該串的某一字首與字尾完全相同,則儲存滿足該條件的最長字首/字尾長度(next[1]記為0)。如串abab,next[1]=0,next[2]=0,next[3]=1,next[4]=2;,在匹配中對模板串(即需要在另一串中查詢其位置/次數的串)構建next陣列

可以注意到,失配陣列中儲存的資訊,也可用於表示上乙個與此處相同的字串的末尾位置(如abab中,末尾ab與前端ab相同,next[4]中值為2,標記著前乙個ab的末尾位置)

在匹配過程中,若出現失配(當前匹配到的位置上兩串字元不同),利用失配陣列可以快速前移模板串,使得模板串該部分的字首,與之前已匹配過的,內容完全一樣的字尾位置重合,並繼續匹配,大幅度減短失配造成的調整時間

先看看如何運用next陣列:

for(int i=0,j=0;t[i];i++)                                //w為模板串

而構建next陣列的過程,思路上可看作自己與自己匹配

void getnext()

val[p] = x;

}

manacher(馬拉車)演算法

馬拉車演算法用於計算字串中每乙個點,以其為中心,最長的回文串長度

馬拉車演算法分兩步:

①兩兩字元插入特殊無關字元,將原串變為長度固定為奇數的串,便於處理

②暴力運算每個點擴充套件出的回文串長度,但當當前處理的點已存在於現前發現的回文串中時,可利用對稱性質減少判定次數

(擴充套件意義似乎不大,直接上**)

void prepare() 

s2[++len] = '\0';

}void manacher()

r[i] = x;

}}

例題

poj - 2752(kmp)

#include#include#includeusing namespace std;

char s[400010];

int next[400010];

void getnext()

return 0;

}

poj 3974(馬拉車)

#include#include#include#includeusing namespace std;

char s[1000010];

char t[2000050];

int r[2000050];

int len;

void prepare()

t[len++]=0;

}int main()

r[i]=x;

int res;

if(t[i]=='#')res=(x/2)*2;

else res=((x-1)/2)*2+1;

if(res>ans)ans=res;

} printf("%d\n",ans);

/*for(int i=1;icout

} return 0;

}

鄭州集訓DAY3筆記

成績 題目成績 評價t1 100感動。總算上了一百分 t210 本來以為能騙到40?t30 真的不會做 字串hash 一種從字串到整數的對映 通過這樣的對映,把比較兩字串是否相同轉化為兩整數是否相同 若比較發現兩字串hash值相等,我們認為兩字串很大可能是相同的 另一方面,若 hash 值不等,則兩...

胡昌澤day2筆記

任務15 鏈式賦值x y 123 系列解包賦值 a,b,c 1,2,3 變數互換a,b b,a python不支援常量 任務16,內建 最基本的內建函式 整型 浮點型 布林型 字串型 8 2 4.0 7 2 3 7 4 3 2 3 8 divmod 10,3 3,1 17,整數 二進位制0b101 ...

教父3 筆記

教父3是一部很矯情的 原因在於教父3就是一部斬草不除根,然後還亮將禍患留在自己身邊,首領貼心照顧偏愛這個禍害,禍害長大了開始秘密禍害這個家族,然後首領還是不忍心處理掉這個禍害,忠心耿耿的手下被殺才布局讓手下去除掉禍害!大部分時間講述好萊塢的各種齷齪和骯髒,我猜想國內大部分是看電影過來的,如果以閱讀 ...