萬惡的字串DSA(載入中 )

2021-08-21 07:48:28 字數 3844 閱讀 8910

這個字串的演算法實在是令人頭大。模擬起來也不是很盡人意。就來這裡總結一下。不然自己看的比較累。半夜機房裡都是在喊這個演算法怎麼這麼妙

來一段簡短的**理解一下orz

//自動溢出版

typedef

unsigned

long

long ull; //用ull偷個懶而且可以自動溢位

const

int maxn=200010;

const ull base=233;//常規base233

char ch[maxn];

ull hashs(char *s)

return sum;

}

//取模版

typedef

unsigned

long

long ull; //用ull偷個懶而且可以自動溢位

const

int maxn=200010;

const ull base=233,mod=1e9+7;//常規base233

char ch[maxn];

ull hashs(char *s)

return sum;

}

//結構體版

typedef

unsigned

long

long ull;

const

int maxn=200010;

const ull base=233,mod1=1e9+7,mod2=1e9+9;//

char ch[maxn];

ull hashs(char *s,ull mod)

return sum;

}struct nodenum[maxn];

int main()

//pair版

typedef

unsigned

long

long ull;

const

int maxn=200010;

const ull base=233,mod1=1e9+7,mod2=1e9+9;//這兩個是孿生素數

char ch[maxn];

ull hashs1(char *s,ull mod)

return sum;

}pair hi

=(∑l

en−1

i=0s

[i]∗

blen

−i−1

)mod

h i=

(∑i=

0len

−1s[

i]∗b

len−

i−1)

modp

p

h[l..r]

=(hr

−hl−

1∗br

−l+1

)mod

' role="presentation">h[l

..r]

=(hr

−hl−

1∗br

−l+1

)mod

h[l.

.r]=

(hr−

hl−1

∗br−

l+1)

modp

p

int f[maxn];

int manacher()else

while(s_new[i-f[i]]==s_new[i+f[i]])

f[i]++;

if(mxid=i;

mx=f[i]+i;

}max_len=max(max_len,f[i]-1);

}return max_len;

}

這個真的是乙個神奇的演算法,神奇到你根本不知道他是怎麼求出來的orz盯著螢幕看了半天才看懂這個kmp。需要花點時間來理解。停更了兩天全部在打cf..(就是我兩天爆零的題解),重新回歸字串的懷抱。

關鍵的步驟就是在nxt的求取,而第一步的本質就是自己與自己的字首進行匹配。目的是找之前重複匹配的子串

從頭開始列舉對應字元,如果當前

j j

位置字元與

k' role="presentation">k

k字元匹配,則下一位j+

1 j+1

失配時,會在k+

1 k+1

位重新匹配(因為之前的都是相互遞推匹配的),即: nx

t[j+

1]=k+1n

xt[j

+1]=

k+1如果當前位失配,則

k k

跳回到nxt

[k]' role="presentation">nxt

[k]n

xt[k

]重新進行匹配判斷直至頭結點。

如果你從運動方式來看,其實還是比較難理解的,但是如果你從你所需要實現的目的去思考,則還是比較好理解的。

#include 

#include

using

namespace

std;

const

int maxn=20000;

char p[maxn];//模式串

int nxt[maxn];

void get_nxt_val()

}

#include 

#include

using

namespace

std;

const

int maxn=300000;

char p[maxn],s[maxn];

int nxt[maxn];

int kmp_search()

}

這個演算法其實還是比較簡單的。看文字就好了,不需要什麼圖來詳細地進行介紹。所以只放一張圖。

同學們看清楚啊這個是ac自動機啊!不是自動ac機啊!

void get_fail()

}while(!q.empty())else

//不存在這個子節點

ac[u].vis[i]=ac[ac[u].fail].vis[i];

//當前節點的這個子節點指向當

//前節點fail指標的這個子節點

} }}

雖然上面四句話看著比較繞。但大家還是根據程式多多畫圖模擬來進行深入了解。

第3步就是查詢了。雖然光說話比較廢但是說話吧..

Python 2中萬惡的字元編碼

我們知道,在計算機發展初期,計算機只能識別字母,數字和一些基本符號,其使用8位儲存空間儲存所有的內容,也就是2 8 256個不同的結果,這就是ascii碼。在當時的情況下,並沒有想到日後其他語言文字的擴充套件,隨著不斷的發展,對計算機的使用越來越廣泛,使用8位儲存空間早已不能滿足人們的日常需求,所以...

JSP傳參亂碼,萬惡的全形字符

最近在做乙個 專案需要前台增加乙個 remark 備註 字段傳遞到後台儲存。前台的處理是乙個輸入文字框。後台接收使用簡單的 request.getparameter remark 由於頁面是非同步的請求,有多個request,為了防止remark欄位丟失,使用儲存到session的方法。reques...

iOS中OC載入HTML字串

最近專案裡面遇見了 html 字串,整理如下 後台返回字串的樣式 在 ios 中通常載入 html 字串有兩種方式 void viewdidload 將 等類似的字元轉化為html中的 nsstring htmlentitydecode nsstring string 將html字串轉化為nsatt...