题面

就是让你——在字符串A中,如果字符串B是A的子串,那么就删除在A中第一个出现的B,然后拼接在一起,一直重复上述步骤直到B不再是A的子串

|A|\(\le 10^6\)


思路:

KMP+栈

1、由于是两个字符串匹配的问题,当然一下子就会想到KMP

2、由于是删去一段区间,很多人第一反应会想到链表,但是在这里,其实删除了一段后,对之前没有影响的,并且,一定是从后往前删除,所以,更优的存储结构应该是

3、有人会问,为什么删去对前面没有影响,这就根据KMP的原理,做到i这个位置的结果就是最优的,我们只需要用f数组记录一下KMP匹配的结果(f[i]表示以i结尾最大能匹配多长的字符串)。

如何进行?

1、KMP板子跑一遍

2、在KMP过程中,把遍历到的i(不是字符,而是下标)入栈,当匹配到一个完整的串时,把这一整串出栈,然后j从栈顶的i所能匹配到的最大的位置开始(就是f[i]记录的值),继续做KMP

时间复杂度:B自身匹配一次+A与B匹配一次+A中最多每个字符进出栈一次,这么说来时间复杂度还是线性


于是,代码就很好构造了

Code:

#include<bits/stdc++.h>
#define N 1000010
using namespace std;
int la,lb,res;
char a[N],b[N];
int p[N],f[N];//分别表示B串自身匹配的结果、A串与B串匹配的结果
int St[N],top;//模拟栈,STL的栈也是可以的,就是比较低效
int main()
{
int i,j;
scanf("%s",a+1);
scanf("%s",b+1);
la=strlen(a+1);
lb=strlen(b+1);
for(i=2,j=0;i<=lb;i++)//自身匹配
{
while(j&&b[i]!=b[j+1])
j=p[j];
if(b[i]==b[j+1])
j++;
p[i]=j;
}
for(i=1,j=0;i<=la;i++)//A与B匹配
{
while(j&&a[i]!=b[j+1])
j=p[j];
if(a[i]==b[j+1])
j++;
f[i]=j;//记录结果
St[++top]=i;//入栈
if(j==lb)//如果匹配成功
{
res=lb;
while(res)//出栈,res记录应该出多少字符
res--,top--;
j=f[St[top]];//更新j值
}
}
for(i=1;i<=top;i++)//大功率输出
printf("%c",a[St[i]]);
return 0;
}

推荐题目:

Luogu P3121 [USACO15FEB]审查(黄金)Censoring (Gold) 似乎这俩是一对?!

最新文章

  1. Android课程---简单的音乐播放器
  2. Unity VR全景漫游
  3. JSONP和CORS两种跨域方式的简单介绍和解决方案实例
  4. a标签鼠标经过,字颜色和下划线的颜色都变红
  5. Ubuntu 关闭锁屏界面的 on-screen keyboard
  6. Codeforces Round #337 (Div. 2) B. Vika and Squares 水题
  7. mysql添加索引
  8. Spring EL method invocation example
  9. SharePoint 2013 error The given assembly name or codebase System.ServiceModel.dll was invalid
  10. [topcoder]UnsealTheSafe
  11. Android之断点续传下载
  12. spring mvc redirect设置FlashAttribute
  13. 面向对象重写(override)与重载(overload)区别 (转)
  14. C#之IComparable用法,实现List&lt;T&gt;.sort()排序
  15. Excel将一列数据变为两列
  16. XVIII Open Cup named after E.V. Pankratiev. GP of Urals
  17. OpenGL ES: 纹理采样 texture sample
  18. ios开发之--NSString中substringFromIndex,substringWithRange,substringToIndex方法的使用
  19. Spring注解开发简要步骤
  20. 事件响应的优先级、stopProgapation禁止下层组件响应

热门文章

  1. HZOJ 数颜色
  2. Transformer的PyTorch实现
  3. win10 uwp httpClient 登陆CSDN
  4. QQ 第三方登录
  5. LightOJ 1123 Trail Maintenance
  6. hdu 2126 Buy the souvenirs(记录总方案数的01背包)
  7. jQuery中的siblings()的用法
  8. 2018-2-25-git-rebase-合并多个提交
  9. 基于@AspectJ注解配置切面与基于XML配置切面
  10. 利用SpEL 表达式实现简单的动态分表查询