KMP字符串匹配 模板 洛谷 P3375

题意

如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置。

为了减少骗分的情况,接下来还要输出子串的前缀数组next。(如果你不知道这是什么意思也不要问,去百度搜[kmp算法]学习一下就知道了。)

样例:

输入
ABABABC
ABA
输出
1
3
0 0 1

解题思路

当然是使用KMP啦,只不过这个要求比较高一些。

注意这里要输出的next数组内容是不能进行优化的那种,否者就会WA,带有优化的可以看第一个代码。

详情见代码。这个也可以算作一个模板了。

代码实现

//这个是对next进行的优化
void getnext() //做的第一步是获得next【】的值
{
int i=0,k=-1;
next[0]=-1;
while(i<lenb)
{
if(k==-1)//这里和平常的有些不同,这里进行了一些优化,将两个条件分开了。
{
next[++i]=++k;
continue;
}
if (b[i]==b[k])
{
if(b[i+1]==b[k+1]) //这里进行了优化,一般介绍KMP的文章中都有会这个。
next[++i]=next[++k];
else
next[++i]=++k;
}
else k=next[k];
}
}
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=1e6+7;
char a[maxn],b[maxn];
int next[maxn];
int lena, lenb;
void getnext() //做的第一步是获得next【】的值
{
int i=0,k=-1;
next[0]=-1;
while(i<lenb)
{
if (k==-1 || b[i]==b[k])
next[++i]=++k;
else k=next[k];
}
}
void KMP()
{
getnext();
int i=0,j=0,cnt=0;
while (i<lena)
{
if (j==-1||a[i]==b[j])
{
i++;j++;
}
else j=next[j];
if (j==lenb)
{
printf("%d\n", i-j+1);
j=next[j];
}
}
}
int main()
{
while(scanf("%s",a)!=EOF)
{
scanf("%s",b);
lena=strlen(a);
lenb=strlen(b);
KMP();
for(int i=1; i<=lenb; i++)
{
printf("%d ", next[i]);
}
printf("\n");
}
return 0;
}

最新文章

  1. Python—模块
  2. 浅析Hadoop文件格式
  3. SoapUI中Groovy的实用方法
  4. 获取https证书
  5. SQL分组查询GroupBy
  6. Android控件拖动的实现
  7. 个人作业3——个人总结(Alpha阶段)
  8. 搭建第一个spring boot项目
  9. python之函数用法isupper()
  10. linux 系统安装配置 zabbix服务(源码安装)
  11. Find–atime –ctime –mtime的用法与区别总结
  12. selenium -- 鼠标悬停
  13. 选择排序(直接排序)java语言实现
  14. MVC实现多选下拉框,保存并显示多选项
  15. Dapper 中使用sql in 关键字查询
  16. ORA-12899: value too large for column
  17. exynos4412—UART裸板复习
  18. python基础之迭代器协议和生成器(二)
  19. Android 画廊效果之ViewPager显示多个图片
  20. GuozhongCrawler系列教程 (2) CrawTaskBuilder具体解释

热门文章

  1. Node.js之querystring模块
  2. 设置HTML的TextArea标记跟随文本内容自动设置高度
  3. Comet OJ - Contest #14题解
  4. html b标签 语法
  5. tomcat8 的优化
  6. C和C++中的副本机制
  7. 金蝶K3 WISE 13.1版本服务器虚拟机环境部署
  8. jenkins 管理员密码重置
  9. java.sql.SQLException: The server time zone value &#39;&#195;–&#195;&#194;&#185;&#195;&#186;&#194;&#177;&#195;&#170;&#195;—&#194;&#188;&#195;Š&#194;&#177;&#194;&#188;&#195;&#164;&#39; is unrecognized or repr
  10. gitblit 数据迁移(复制)