$KMP$问题的核心在于数组$next$(或者$pre$/$fail$,各种叫法),几乎所有的此类型题都是需要计算$next$的。

这里解释一波$next$:即满足字符子串$s[1...k]=s[j-k+1...j]$的最大$k$。比如说:

字符串$abaca$的$next[5]$就是$1$,因为只有$s[1]=s[5]$。

而字符串$abcab$的$next[5]$就是2,同理,$s[1...2]=s[4...5]$。

弄清楚了这一点,来看题目,显然,这道题的难点在于删除字符后有可能对前面已经匹配完了的字符产生新一次的匹配,因为后面新加入的字符可能对前面的字符有贡献。

既然这样,我们不妨设一下四个变量:$i,j,k,l$(所有字符串从$0$开始)。

其中$i,l$表示当前需要将$S_i$加入到$U_l$中,$j$表示当前匹配到了$T_j$,$k$表示当前已经匹配到$U_k$。

  • 如果当$k==l$时,代表前$k-1$个字符已经匹配完,添加新字符。
  • 接下来就是调整$next$和判断是否匹配,同普通$KMP$算法 。
  • !!重点:当$j==lenT$即已经匹配完了,则将$j$归零,将$l$减去$lenT$示删去了$lenT$个字符,因为$l$就是新串的长度,接下来,我们直接将$k$减去$lenT\times 2$因为前面最多会有$lenT-1$个字符与$T$匹配,特判一下当$k<0$时将$k$置为$0$就可以了。

#include <cstdio>
#include <cstring> const int Len = 1e6 + 10;
char S[Len], T[Len], U[Len];
int lenS, lenT, nxt[Len]; void init () {
for (int i = 1, j = 0; i < lenT; ++i) {
while (j && T[i] != T[j]) j = nxt[j];
j += (T[i] == T[j]), nxt[i + 1] = j;
}
} int main () {
scanf ("%s%s", S, T);
lenS = strlen (S), lenT = strlen(T);
init ();
int l = 0, k = 0, i = 0, j = 0;
while (i < lenS) {
if (k == l) U[l++] = S[i++];
while (j && U[k] != T[j]) j = nxt[j];
j += (U[k] == T[j]);
if (j == lenT) {
j = 0, l -= lenT;
k -= lenT << 1;
}
if (k < 0) k = 0;
else ++k;
}
for (int i = 0; i < l; ++i)
putchar (U[i]);
return 0;
}

最新文章

  1. 给div添加滚动条
  2. c#.net WinForm 线程内 调用窗体控件
  3. HDU5008 Boring String Problem(后缀数组)
  4. 使用Spring 3的@value简化配置文件的读取
  5. java NIO与IO的区别
  6. longest common str
  7. VB6之HOOK技术
  8. Keepalived+Nginx实现高可用负载均衡集群
  9. python面试题之Python支持什么数据类型?
  10. 『The Captain 最短路建图优化』
  11. cmd返回上一级和根目录
  12. Leetcode 66.加一 By Python
  13. 2017/2/13:springMVC拦截器的使用
  14. 使用Dlib来运行基于CNN的人脸检测
  15. Spring Boot—14JdbcTemplate
  16. getopt--parse command line options
  17. 二十二 synchronized同步方法
  18. 关于在Arduino中调用DS1302模块
  19. git - 使用原理
  20. 理解java的 多态

热门文章

  1. Codeforces Round #380 (Div. 2)/729E Subordinates 贪心
  2. [Luogu 2580] 于是他错误的点名开始了
  3. asp.net 文件上传,大文件上传。
  4. 适配器模式 C#
  5. Mac 上真机调试cocos2d-x-3.16的test程序
  6. js_开发小技巧记录(一)
  7. javascript中=、==与===的区别
  8. 【Python学习笔记】使用Python计算皮尔逊相关系数
  9. Linux 入门记录:六、Linux 硬件相关概念(硬盘、磁盘、磁道、柱面、磁头、扇区、分区、MBR、GPT)
  10. ICTPOS3.0 词性标注集