KMP算法&拓展KMP算法模板
2016-08-26 16:34
281 查看
KMP
拓展KMP
const int M=100010;
const int N=100010;
char a
,b[M];
int nxt[M],ex
;
int n,m;
void Cal_nxt()
{
int i=0;
nxt[0]=m;
while(b[0]==b[i+1]&&i+1<m) i++;
nxt[1]=i;
int po=1;
for(i=2;i<m;i++)
{
if(nxt[i-po]+i<nxt[po]+po) nxt[i]=nxt[i-po];
else
{
int j=nxt[po]+po-i;
if(j<0) j=0;
while(i+j<m&&b[j]==b[j+i]) j++;
nxt[i]=j;
po=i;
}
}
}
void Exkmp()
{
int i=0;
cal_nxt();
while(a[i]==b[i]&&i<n&&i<m) i++;
ex[0]=i;
int po=0;
for(i=1;i<n;i++)
{
if(nxt[i-po]+i<ex[po]+po) ex[i]=nxt[i-po];
else
{
int j=ex[po]+po-i;
if(j<0) j=0;
while(i+j<n&&j<m&&a[j+i]==b[j]) j++;
ex[i]=j;
po=i;
}
}
}
char a ,b ; int nxt ; int n,m; void Cal_nxt() { int i; nxt[0]=-1; for(i=1;i<m;i++) { int j=nxt[i-1]; while(j>=0&&b[i]!=b[j+1]) j=nxt[j]; nxt[i]=b[i]==b[j+1]?j+1:-1; } } int Kmp() { int i,j=0; for(i=0;i<n&&j<m;i++) { while(j>0&&a[i]!=b[j]) j=nxt[j-1]+1; if(a[i]==b[j]) j++; } return (j==m)?(i-m):-1; }
拓展KMP
const int M=100010;
const int N=100010;
char a
,b[M];
int nxt[M],ex
;
int n,m;
void Cal_nxt()
{
int i=0;
nxt[0]=m;
while(b[0]==b[i+1]&&i+1<m) i++;
nxt[1]=i;
int po=1;
for(i=2;i<m;i++)
{
if(nxt[i-po]+i<nxt[po]+po) nxt[i]=nxt[i-po];
else
{
int j=nxt[po]+po-i;
if(j<0) j=0;
while(i+j<m&&b[j]==b[j+i]) j++;
nxt[i]=j;
po=i;
}
}
}
void Exkmp()
{
int i=0;
cal_nxt();
while(a[i]==b[i]&&i<n&&i<m) i++;
ex[0]=i;
int po=0;
for(i=1;i<n;i++)
{
if(nxt[i-po]+i<ex[po]+po) ex[i]=nxt[i-po];
else
{
int j=ex[po]+po-i;
if(j<0) j=0;
while(i+j<n&&j<m&&a[j+i]==b[j]) j++;
ex[i]=j;
po=i;
}
}
}
相关文章推荐
- 必虎的无线路由器
- 关于File.expand_path
- 移除ArrayList中的重复元素
- Android中nemu菜单的字体太小?如何设置actionbar中menu的text的size
- iOS base64 加密解密 通用类
- Spring核心面向接口编程小程序
- JAVA中subString的用法
- 洗牌----网易有道2017内推编程题还未完成。
- 数据库存储对象数据注意点
- 压缩文件夹,解压缩
- 实现两个下拉选框内容不一致的JS代码
- 对IOC,AOP的理解
- dialog 的 immerse mode
- 代理接口
- iOS 获取沙河路径
- Python接口对json串的处理
- Callable、Future、FutureTask 分析
- ERROR: Error installing cocoapods: activesupport requires Ruby version >= 2.2.2 升级ruby
- 图像分辨率和图像大小的计算
- PHP文件下载