這個字串的演算法實在是令人頭大。模擬起來也不是很盡人意。就來這裡總結一下。不然自己看的比較累。半夜機房裡都是在喊這個演算法怎麼這麼妙來一段簡短的**理解一下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...