P5410 【模板】扩展 KMP

 #include<bits/stdc++.h>
using namespace std;
const int maxn = 1e6+;
int q, nxt[maxn], extend[maxn];
string a, b;
void getnxt() {
nxt[] = b.size();
int now = ;
while (b[now]==b[+now] && now+<b.size()) now++;
nxt[] = now;
int p = ;
for (int i = ; i < b.size(); i++) {
if (i+nxt[i-p] < nxt[p]+p) nxt[i] = nxt[i-p];
else {
int now = nxt[p]+p-i;
now = max(now,);
while (b[now]==b[i+now] && i+now<b.size()) now++;
nxt[i] = now;
p = i;
}
}
}
void exkmp() {
getnxt();
int now = ;
while (a[now]==b[now] && now < min(a.size(),b.size())) now++;
extend[] = now;
int p = ;
for (int i = ; i < a.size(); i++) {
if (i+nxt[i-p] < extend[p]+p) extend[i] = nxt[i-p];
else {
int now = extend[p]+p-i;
now = max(now,);
while (b[now]==a[i+now] && now<b.size() && now+i<a.size()) now++;
extend[i] = now;
p = i;
}
}
} int main() {
cin >> a >> b;
exkmp();
int len = b.size();
printf("%d",nxt[]);
for (int i = ; i < len; i++) printf(" %d",nxt[i]);
printf("\n"); len = a.size();
printf("%d",extend[]);
for (int i = ; i < len; i++) printf(" %d",extend[i]);
printf("\n");
return ;
}

最新文章

  1. Qt工程打包发布
  2. [PHP]使用PHPMailer发送带附件并支持HTML内容的邮件
  3. MFC ADO连接Oracle12c数据库 服务端配置
  4. 网站开发常用jQuery插件总结(13)定位插件scrollto
  5. Html代码Font-Size中px与pt的区别
  6. 基础知识 mfc
  7. HTML 转文本及HTML内容提取(C#)
  8. linux一句话问答(网络无关篇+网络相关篇+程序开发篇+经典图书)
  9. PHPMailer实现PHP邮件发送
  10. Django配置session
  11. JavaScript基础知识(if、if else、else if、while、switch...case语句)
  12. [LeetCode] Implement Magic Dictionary 实现神奇字典
  13. consul分布式集群搭建
  14. Java 读取配置文件数据
  15. 微信小程序---分包加载(subpackages)及报错
  16. crontab 详解
  17. iOS 加密的3种方法
  18. String和StringBuffer和StringBuilder
  19. Linux alias命令详解
  20. Android -- 点击双下返回退出程序

热门文章

  1. 米特运输——(dfs)
  2. linux的p0f检测,分析抓包信息
  3. Git 简明手册
  4. java1-3总结 19201421-吴志越
  5. 【Linux常见命令】route命令
  6. #Week1 Introduction
  7. 解决Chrome插件安装时出现的“程序包无效”问题
  8. RF(常用关键字)
  9. Linux下swap到底有没有必要使用
  10. golang之channel