题目大意:

就是现在给出两个字符串A, B, 长度都不超过500万, 要求每次将B中第一次A的出现删除, 然后将B剩下的两段前后合并, 然后重复这个过程直到没有可以删除的A位置, 问最后剩下的串是什么

大致思路:

首先看这个字符串的长度不难想到用KMP处理出A的next数组

然后考虑在B上进行匹配, 这里我用的是两个数组来模拟链表, 表示剩下的串, 每次发生删除时, 将当前位置的指针前移即可, 由于删除的串不会在之后进行匹配, 整体的时间复杂度是O(|A| + |B|)

代码如下:

Result  :  Accepted     Memory  :  51820 KB     Time  :  848 ms

/** Author: Gatevin* Created Time:  2015/10/1 9:22:45* File Name: A.cpp*/
#include<iostream>
#include<sstream>
#include<fstream>
#include<vector>
#include<list>
#include<deque>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<bitset>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cctype>
#include<cmath>
#include<ctime>
#include<iomanip>
using namespace std;
const double eps(1e-8);
typedef long long lint;
char a[5000010];
char b[5000010];
int next[5000010];
int len1, len2;
void getNext()
{for(int i = 0; i <= len1; i++)next[i] = 0;for(int i = 1; i < len1; i++){int j = i;while(j > 0){j = next[j];if(a[j] == a[i]){next[i + 1] = j + 1;break;}}}return;
}
int nex[5000010];
int bef[5000010];
int main()
{while(gets(a)){
<span style="white-space:pre"> </span>gets(b);len1 = strlen(a), len2 = strlen(b);if(len1 > len2){printf("%s\n", b);continue;}getNext();for(int i = 0; i <= len2; i++){nex[i] = i + 1;bef[i] = i - 1;}for(int i = 0, j = 0; i < len2;){if(j < len1 && b[i] == a[j]) j++;else{while(j > 0){j = next[j];if(b[i] == a[j]){j++;break;}}}if(j == len1){int ti = i;for(int k = 0; k < len1; k++){i = bef[i];}if(i == -1){bef[nex[ti]] = -1;i = nex[ti];j = 0;continue;}else{nex[i] = nex[ti];bef[nex[ti]] = i;for(int k = 2; k < len1; k++){if(bef[i] != -1)i = bef[i];}j = 0;}}else i = nex[i];}int cnt = 0;int now = len2;while(bef[now] != -1){//putchar(b[bef[now]]);a[cnt++] = b[bef[now]];now = bef[now];}for(int i = cnt - 1; i >= 0; i--)putchar(a[i]);putchar('\n');}return 0;
}

SCU 4438 Censor (KMP)相关推荐

  1. ACM: SCU 4438 Censor - KMP

    SCU 4438 Censor Time Limit:0MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Practice Des ...

  2. 【哈希-字符串匹配+模拟栈】SCU - 4438: Censor(哈希详解哈哈哈)

    写在前:由于哈希没有好好听讲,也没有下来看.这是排位我开的第一道题,直接string暴力T了.昨天其实就看了哈希,太浮躁,于是本来很简单的哈希愣是没看懂.(于是放弃去看爱5了23333333)今天补上 ...

  3. SCU - 4438 Censor (KMP)

    Censor frog is now a editor to censor so-called sensitive words (敏感词). She has a long text pp. Her j ...

  4. SCU - 4438 Censor

    Censor frog is now a editor to censor so-called sensitive words (敏感词). She has a long text pp. Her j ...

  5. SCU - 4438 Censor

    Censor frog is now a editor to censor so-called sensitive words (敏感词). She has a long text p . Her j ...

  6. SCU - 4438——Censor(哈希)

    题目链接:http://acm.scu.edu.cn/soj/problem.action?id=4438 题意:给出一个串a和串b,串b中如果有a串则删除,删除后b剩下的串再连到一起,再找串a,反复 ...

  7. SCU 4438:Censor

    Censor frog is now a editor to censor so-called sensitive words (敏感词). She has a long text p . Her j ...

  8. SCU 4438 Censor

    $KMP$,链表. 将$p$弄成链表,每次匹配到,删掉中间的,继续匹配. #include<bits/stdc++.h> using namespace std;const int INF ...

  9. SCU 4438 Censor(Hash)题解

    题意:找出字符串p中的w串删除,反复操作,直到找不到w,输出这个串 思路:哈希处理前缀和,如果值相同就删掉. 代码: #include<iostream> #include<algo ...

最新文章

  1. moment格式换时间_1个顶20个!这个格式转换神器到底有多神?今年最想给你分享的软件!...
  2. 使用kubectl port-forward暴露minikube k8s service端口
  3. C、C++和MFC中文件的操作
  4. Linux基本管理七大流程
  5. SpringMVC入门实例及详细讲解
  6. 利用openssl创建私有CA的步骤和过程
  7. ua获取手机型号_JavaScript获取移动设备型号的实现代码(JS获取手机型号和系统)...
  8. c语言陈湘骥答案,c语言程序设计实验指导答案陈湘骥
  9. 教你做系统的公众号选题规划,建立自己的选题库
  10. winword.exe应用程序错误
  11. 华为主题引擎怎么下载_华为搜索引擎app
  12. SharePoint Project导入(mpp文件导入)
  13. 从TOP100summit看产品设计和运营创新的“B”计划和“C”计划
  14. 【项目管理】项目进度管理
  15. [Tensorflow]关于TFRecord和tf.Example的使用
  16. 生活随记 - 房产过户与税费贷
  17. 新手淘宝卖家不知道如何运营店铺,精细化运营让你走的更远
  18. Linux学习准备,nethogs,htop,nmon,dstat用法
  19. 电脑系统还原,电脑系统还原步骤,ghost系统还原教程
  20. 浅述 国产思仪 4052系列信号/频谱分析仪

热门文章

  1. 【数据结构】波兰式、逆波兰式与中缀表达式
  2. 计算机视觉——多视图几何
  3. Camtasia字幕添加教程
  4. 车载开发之CarLife技术
  5. 海外独立站创业,Shopify网站如何引流
  6. hiti打印机android驱动,诚研Prinhome P461驱动
  7. HDU1847Good Luck in CET-4 Everybody!递推求解必胜、必败点 附三种经典博弈
  8. 基于大学生方程式赛车的车速测量与数据显示
  9. 文案馆头像壁纸小程序源码+带后台
  10. MATLAB数学建模(4)-数据的统计和分析