KMP模板
来源:互联网 发布:tensorflow百度云 编辑:程序博客网 时间:2024/06/18 08:00
#include <iostream>
#include<string.h>
#include<stdio.h>
using namespace std;
char s[1000001];
int next[10005];//next[i] 0-i字符串最大匹配数
/*
* next[]的含义:x[i-next[i]...i-1]=x[0...next[i]-1]
* next[i]为满足x[i-z...i-1]=x[0...z-1]的最大z值(就是x的自身匹配)next[i]=z;
*/
void getnext(char x[])
{
int i,j,m;
next[0]=0;
next[1]=0;
m=strlen(x);
for(i=1;i<m;i++)
{
j=next[i];
while(x[i]!=x[j])
{
if(j==0)break;
j=next[j];
}
if(x[i]==x[j])
next[i+1]=j+1;
else next[i+1]=0;
}
}
int KMP(char x[],char y[])
{//x是模式串,y是主串
int i,j;
int ans=0;
int m=strlen(x);
int n=strlen(y);
getnext(x);
j=0;
for(i=0;i<n;i++)
{
while(x[j]!=y[i])//如果发现失配了,j=next[j]的
//意思是找到j-1结尾的最长前缀等于最长后缀的下一个字符与y[i]比较,看相等与否
{
if(j==0)break;
j=next[j];
}
if(x[j]==y[i])j++;
if(j==m)
{
ans++;
j=next[j];
}
}
return ans;
}
int main()
{
int n;
char p[10005];
while(scanf("%d",&n)!=EOF)
{
while(n--)
{
scanf("%s%s",p,s);
getnext(p);
for(int i=0;i<=strlen(p);i++)
{
cout<<next[i]<<" ";
}
//printf("%d\n",KMP(p,s));
}
}
return 0;
}
#include<string.h>
#include<stdio.h>
using namespace std;
char s[1000001];
int next[10005];//next[i] 0-i字符串最大匹配数
/*
* next[]的含义:x[i-next[i]...i-1]=x[0...next[i]-1]
* next[i]为满足x[i-z...i-1]=x[0...z-1]的最大z值(就是x的自身匹配)next[i]=z;
*/
void getnext(char x[])
{
int i,j,m;
next[0]=0;
next[1]=0;
m=strlen(x);
for(i=1;i<m;i++)
{
j=next[i];
while(x[i]!=x[j])
{
if(j==0)break;
j=next[j];
}
if(x[i]==x[j])
next[i+1]=j+1;
else next[i+1]=0;
}
}
int KMP(char x[],char y[])
{//x是模式串,y是主串
int i,j;
int ans=0;
int m=strlen(x);
int n=strlen(y);
getnext(x);
j=0;
for(i=0;i<n;i++)
{
while(x[j]!=y[i])//如果发现失配了,j=next[j]的
//意思是找到j-1结尾的最长前缀等于最长后缀的下一个字符与y[i]比较,看相等与否
{
if(j==0)break;
j=next[j];
}
if(x[j]==y[i])j++;
if(j==m)
{
ans++;
j=next[j];
}
}
return ans;
}
int main()
{
int n;
char p[10005];
while(scanf("%d",&n)!=EOF)
{
while(n--)
{
scanf("%s%s",p,s);
getnext(p);
for(int i=0;i<=strlen(p);i++)
{
cout<<next[i]<<" ";
}
//printf("%d\n",KMP(p,s));
}
}
return 0;
}
0 0
- KMP模板
- KMP 模板
- kmp模板
- kmp模板
- kmp模板
- KMP模板
- kmp模板
- kmp模板
- KMP 模板
- 【模板】KMP
- KMP模板
- KMP模板
- 【KMP 模板】
- KMP模板
- KMP 模板
- kmp模板
- KMP模板
- KMP 模板
- ARM Linux 3.x的设备树(Device Tree)
- 5289 Assignment (RMQ+二分区间)
- 在 Android 应用中使用 HTML Parser 便捷的解析 html 内容
- 相似图片搜索的原理
- 鼠标经过三维物体时放大并旋转,离开时停止旋转,恢复到原来大小
- KMP模板
- 黑马程序员——Java基础-多线程
- HDU5299拓扑排序和博弈
- 读《沃伦巴菲特》有感
- Android中的多线程编程(一)附源码
- archive log文件大小与redo log文件大小关系探究
- 基类与派生类的关系
- &与&&的区别
- 哈理工 oj 2122 旅行(map + 最短路dij算法)