struct SAM {
static const int MAXN = 1e6 + 10;
struct State {
int nxt[26];
int len;
int lnk;
} st[2 * MAXN];
int siz;
int lst;
void Init() {
siz = 0;
lst = 0;
ms(st[0].nxt);
st[0].len = 0;
st[0].lnk = -1;
}
void Extend(int c) {
int u = ++siz;
st[u].len = st[lst].len + 1;
int p = lst;
while(p != -1 && st[p].nxt[c] != 0) {
st[p].nxt[c] = u;
p = st[p].lnk;
}
if(p == -1)
st[u].lnk = 0;
else {
int q = st[p].nxt[c];
if(st[p].len + 1 == st[q].len)
st[u].lnk = q;
else {
int v = ++siz;
mc(st[v].nxt, st[q].nxt);
st[v].len = st[p].len + 1;
st[v].lnk = st[q].lnk;
while(p != -1 && st[p].nxt[c] == q) {
st[p].nxt[c] = v;
p = st[p].lnk;
}
st[q].lnk = st[u].lnk = v;
}
}
lst = u;
}
} sam;
相关文章
- 10-12将逗号分隔 的字符串转化成List
- 10-12用scanf输入字符串
- 10-12关于python字符串基本操作
- 10-12统计一行文本的单词个数 (15 分) 本题目要求编写程序统计一行字符中单词的个数。所谓“单词”是指连续不含空格的字符串,各单词之间用空格分隔,空格数可以是多个。 输入格式: 输入给出一行字符。 输出格式: 在一行中输出单词个数。 输入样例: Let's go to room 209. 输出样例: 5
- 10-12C++中int转为char 以及int 转为string和string 转int和空格分隔字符串
- 10-12Uva 12361 File Retrieval 后缀数组+并查集
- 10-12将字符串以用二进制流的形式读入XML文件
- 10-12c – 如何检查字符串是否全部是小写字母和字母数字?
- 10-12LeetCode --- 字符串系列 --- 转换成小写字母
- 10-12C++与C字符串相关知识点