描述:

  给出两个字符串 s1 和 s2 ,其中 s2 为 s1 的子串,求出 s2 在 s1 中所有出现的位置。同时要求输出 s2 的 fail 数组。

思路:

  KMP模板。

标程:

#include<bits/stdc++.h>
using namespace std;
#define maxn 1000001
char s1[maxn],s2[maxn];
int fail[maxn];
int ans[maxn],cnt;
int len1,len2,j=;
inline void get()
{
for(int i=;i<=len2;i++)
{
while(j&&s2[i]!=s2[j+]) j=fail[j];//不能继续匹配且j还没有减到0,考虑退一步
if(s2[i]==s2[j+]) j++;//能匹配,j的值+1
fail[i]=j;
}
}
inline void kmp()
{
j=;
for(int i=;i<=len1;i++)
{
while(j>&&s1[i]!=s2[j+]) j=fail[j];//不能继续匹配且j还没减到0,减小j的值
if(s1[i]==s2[j+]) j++;//能继续匹配j,j的值+1
if(j==len2)//找到一处匹配
{
ans[++cnt]=i-len2+;//记录位置
j=fail[j];//往后跳,继续找
}
}
}
int main()
{
scanf("%s",s1+);
scanf("%s",s2+);
len1=strlen(s1+);
len2=strlen(s2+);
get();
kmp();
for(int i=;i<=cnt;i++)
printf("%d\n",ans[i]);//输出s2在s1中出现的位置
for(int i=;i<=len2;i++)
printf("%d ",fail[i]);//输出fail数组
return ;
}

最新文章

  1. Java实现FTP文件与文件夹的上传和下载
  2. static与并发
  3. 用修改hosts的方式来屏蔽某些网站
  4. Xcode配置.pch文件
  5. Linux的端口和服务
  6. 精通CSS高级Web标准解决方案(1-1选择器)
  7. 【细说Java】Java封箱拆箱的一些问题
  8. tomcat那些事
  9. project文件问题
  10. 每天一个Linux命令 1
  11. yii2之依赖注入与依赖注入容器
  12. 51 Nod 1027 大数乘法【Java大数乱搞】
  13. 洛谷P4180 [Beijing2010组队]次小生成树Tree(最小生成树,LCT,主席树,倍增LCA,倍增,树链剖分)
  14. windows系统中,在当前目录下打开cmd命令行的两种方法
  15. SQLAlchemy+Flask-RESTful使用(二)
  16. 20165223 《信息安全系统设计基础》 实现mypwd
  17. 定时任务模块 schedule
  18. 第一篇随笔 - Hello world!
  19. 0 vs工程添加sdk
  20. 深入理解java虚拟机---Class文件(二十)

热门文章

  1. ORM for Net主流框架汇总
  2. how to backup your system of Autel MS908 Pro
  3. ES6知识整理(7)--Set和Map数据结构
  4. Eloquent JavaScript #06# class
  5. linux下nginx整合php
  6. sqlalchemy多对多查询
  7. 如何通过 Vue+Webpack 来做通用的前端组件化架构设计
  8. linux配置powerline(bash/vim)美化
  9. javaweb三大框架和MVC设计模式
  10. SVM学习笔记2-拉格朗日对偶