字符串模版
Posted acerkoo
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了字符串模版相关的知识,希望对你有一定的参考价值。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5+10;
char s[maxn], t[maxn];
int nxt[maxn], ext[maxn], f[maxn], p[maxn];
//kmp
void getNext(char *t)
nxt[0] = 0;
for (int i=1, j=0; t[i]; ++i)
while(j && t[i]!=t[j]) j=nxt[j-1];
if(t[i]==t[j]) ++j;
nxt[i] = j;
bool kmp(char *s, char *t)
getNext(t);
bool fg = false, l = strlen(t);
for (int i=0, j=0; s[i]; ++i)
while(j && s[i]!=t[j]) j=nxt[j-1];
if(s[i]==t[j]) ++j;
f[i] = j;
if(j==l) fg = 1;
return fg;
//exkmp
void getNext(char *t, int m)
int a=0, p=0;
nxt[0] = m;
for (int i=1; i<m; ++i)
if(i>=p || i+nxt[i-a]>=p)
if(i>=p) p=i;
while(p<m && t[p]==t[p-i]) ++p;
nxt[i]=p-i;
a=i;
else
nxt[i] = nxt[i-a];
void getExt(char *s, int n, char *t, int m)
getNext(t, m);
int a=0, p=0;
for (int i=0; i<n; ++i)
if(i>=p || i+nxt[i-a]>=p)
if(i>=p) p=i;
while(p<n && p-i<m && s[p]==t[p-i]) ++p;
ext[i] = p-i;
a=i;
else
nxt[i] = nxt[i-a];
// manacher
char str[maxn], ms[maxn];
void init(char *s)
ms[0]='@', ms[1]='#';
for (int i=1; s[i]; ++i) ms[i<<1]=s[i], ms[i<<1|1]='#';
int l = strlen(s);
ms[2*l+2] = '@', ms[2*l+3] = 0;
void manacher(char *str)
init(str);
int l = strlen(ms);
int mx=0, id=0;
for (int i=1; i<l; ++i)
p[i] = mx>i?min(mx-i, p[2*id-i]): 1;
while(p[i]+1<l && ms[i-p[i]]==ms[i+p[i]]) ++p[i];
if(p[i]>mx) mx=p[i], id=i;
int main()
return 0;
以上是关于字符串模版的主要内容,如果未能解决你的问题,请参考以下文章