#include<bits/stdc++.h>
using namespace std;
queue<int> KMP(string a,string b){//a是主串,b是模式串,返回出现位置的下标,如果没有则返回的队列empty()
queue<int> ans;
int i=,j=;//用于比对两个串的下标
int next[b.length()+];//在下标i之前的字符串前后缀相同的最长长度。
next[]=;next[]=;
for(int f=;f<=b.length();f++){//计算next,注意初始化[0]和[1]
while(j>&&b[j]!=b[f-])
j=next[j];
if(b[f-]==b[j])j++;
next[f]=j;
} j=;
int box=;
for(;i<a.length()&&a.length()-i>=b.length()-;i++){//匹配过程
int pointer =i;
for(;;j++){
if(a[pointer]!=b[j]&&j==){//如果通过next回到串头,且串头字符仍然匹配失败,则break使i++
j=;
break;
}else if(a[pointer]!=b[j]){//如果当前字符匹配失败,则通过next到达下一个位置
j=next[j];
i = pointer-;
break;
}else if(b.length()==){//排除特殊情况:字符串长度为1时,匹配成功依然要挪动指针 i
j=;
ans.push(i);
break;
}else if(j==b.length()-){//字符串匹配完成,添加答案到队列,并通过next到达下一个位置
j=next[j];
ans.push(i-box);
box = j;
i=pointer-;
break;
}
pointer++;
}
}
return ans;
} int main(){
string s1,s2;cin>>s1>>s2;
queue<int> que = KMP(s1,s2);
while(!que.empty()){
cout<<que.front()<<" ";
que.pop();
}
}

最新文章

  1. 一个基于jQuery的移动端条件选择查询插件(原创)
  2. NBUT1541 Rainwater 题解
  3. 黑马程序员——JAVA基础之内部类,匿名内部类
  4. You can&#39;t specify target table &#39;charge&#39; for update in FROM clause
  5. 翻译文章“AST 模块:用 Python 修改 Python 代码”---!!注意ironpathyon未实现此功能
  6. App Store内购
  7. 《反project核心原则》说明
  8. vimplugin破解
  9. 基于pytorch实现HighWay Networks之Highway Networks详解
  10. python之shelve模块详解
  11. 微信小程序封装年月日时分组件
  12. 修改Linux主机名
  13. Best Free Hacking E-Books 2017 In PDF Format
  14. IntelliJ IDEA无法更新maven索引
  15. body中相关标签
  16. MS08_067漏洞渗透攻击实践
  17. 简单理解RNA-seq
  18. java学习笔记—JDBC1(16)
  19. bzoj1426: 收集邮票(期望)
  20. 【LOJ】#2349. 「JOI 2017/2018 决赛」团子制作

热门文章

  1. spring security关闭http验证 和 springboot 使用h2数据库
  2. Eclipse控制台不限日志行数
  3. linux服务器安装tomcat
  4. 第二章 Python基础语法
  5. 关于NumPy的常用函数random.randint
  6. EF Core 2.0 执行原始查询如何防止SQL注入
  7. JVM内存管理(一)--GC简介
  8. K380键盘IOS使用
  9. SVN_02安裝
  10. 转 使用IParameterInspector, IOperationBehavior,Attribute(参数检查器、操作行为接口和标签)扩展WCF操作行为