P1425子串清除Accepted

标签:[显示标签]

描述

我们定义字符串A是字符串B的子串当且仅当我们能在B串中找到A串。现在给你一个字符串A,和另外一个字符串B,要你每次从B串中从左至右找第一个A串,并从B串中删除它,直到A串不为B串的子串,问你需要进行几次删除操作。

格式

输入格式

输入文件共2行,第一行一个字符串A(长度小于256),第二行一个字符串B。

30%的数据是随机生成的;

50%的数据满足输入文件大小小于300KB;

100%的数据满足输入文件小于500KB,字符串A、B中只会出现英文字母。

输出格式

输出文件只有一个整数N。

样例1

样例输入1[复制]

abc

abcabcabaabcbccc

样例输出1[复制]

5

限制

1 second

提示

样例说明:abcabcabaabcbccc-> abcabaabcbccc-> abaabcbccc-> ababccc-> abcc

来源

Conan From HNSDFZ

【题解】



KMP问题。

找到一个匹配之后很正常的想法就是把那个匹配删掉。然后指针往前移动2*模式串的长度(这样就可以避免后面的串往前移动漏解了);

然后j=0继续找匹配;

但是直接把它删掉会超时(s.erase()这个函数);

所以考虑边读边输入。

直接指针往前移动模式串的长度,然后把新读入的东西覆盖在删掉的串的开头即可。

当然。不用真的边读边输入。先整串输入下来存成temp,然后再模拟输入就好了。

#include <cstdio>
#include <iostream>
#include <string> using namespace std;
string s2, s1,temp;
int f[200000]; int main()
{
cin >> s2;
int len2 = s2.size();
f[0] = 0; f[1] = 0;
for (int i = 1; i <= len2 - 2; i++)//获取失配函数
{
int t = f[i];
while (t && s2[i] != s2[t]) t = f[t];
f[i + 1] = s2[i] == s2[t] ? t + 1 : 0;
}
int i = 0, j = 0, num = 0,top =0,now = 0;
cin >> temp;//先整串读入下来
int mt = temp.size();
s1 = temp;//用一个top指向当前已经读到哪里了。
while (true)
{
if (i == top)//如果扫描到了需要读入的地方
{
s1[i] = temp[now++];//就模拟读入
top++;//这里可能覆盖了原来删掉的东西。
}
while (j && s2[j] != s1[i]) j = f[j];
if (s2[j] == s1[i]) j++;//KMP算法
if (j == len2)
{
num++;
j = 0;
i = i-len2*2;//这样就可以避免影响了
top -= len2;//串的长度会减少len2
if (i < 0)
i = 0;
}
else
i++;
if (now == mt)//如果已经读到最后一位了。则结束。
break;//如果是在最后一位匹配,那么之前也都不会受到影响了。所以可以大胆的结束
}
printf("%d\n", num);
return 0;
}


2

#include <bits/stdc++.h>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define rei(x) scanf("%d",&x)
#define rel(x) scanf("%I64d",&x) typedef pair<int,int> pii;
typedef pair<LL,LL> pll; const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
const double pi = acos(-1.0);
const int MAXN = 20e4; string a,b;
int lena,lenb,f[MAXN],i = 1,top = 1,j = 1,now = 1,ans = 0;
string s; int main()
{
//freopen("F:\\rush.txt","r",stdin);
cin >> a;
cin >> b;
a=' '+a;
b=' '+b;
lena = a.size()-1;
lenb = b.size()-1;
f[1] = f[2] = 1;
for (int i = 2;i <= lena-1;i++)
{
int t = f[i];
while (t > 1 && a[i]!=a[t]) t = f[t];
f[i+1] = a[i]==a[t]?t+1:1;//a[i]和a[t]相同,那么当a[i+1]失配了
//可以从i+1跳到t+1;看看a[t+1]是不是和所需要的字母相同;
//跳跃!
}
s = b;//一开始s是一个空的字符串;得随便给他赋值一个东西;
while (true)
{
if (top==i)
{
s[i] = b[now++];
top++;
}
while (j>1 && s[i]!=a[j]) j = f[j];
if (s[i]==a[j])
j++;
if (j>lena)
{
i-=lena*2;
if (i<1)
i = 1;
top -=lena;
j = 1;
ans++;
}
else
i++;
if (now>lenb)
break;
}
cout << ans << endl;
return 0;
}

【37.00%】【vijos p1425】子串清除的更多相关文章

  1. Vijos1425子串清除 题解

    Vijos1425子串清除 题解   描述: 我们定义字符串A是字符串B的子串当且仅当我们能在B串中找到A串.现在给你一个字符串A,和另外一个字符串B,要你每次从B串中从左至右找第一个A串,并从B串中 ...

  2. linux学习笔记--文件

    文件系统 ls -lhi i inode 相当于文件在磁盘里的唯一标示,index node h 代表文件大小k,m [root@masters ~]# [root@masters ~]# ls -l ...

  3. Shell文本处理 - 匹配与编辑

    正则表达式 符号 含义 . 匹配任意ASCII中任意单个字符,或是字母,或是数字 ^ 匹配行首 $ 匹配行尾 * 匹配任意字符或前一个的一次或多次重复 \ 转义,被转义的有$ . ‘ “ * [ ] ...

  4. MySQL二进制日志总结

    二进制日志简单介绍 MySQL的二进制日志(binary log)是一个二进制文件,主要用于记录修改数据或有可能引起数据变更的MySQL语句.二进制日志(binary log)中记录了对MySQL数据 ...

  5. 烽火2640路由器命令行手册-13-VPDN(L2TP,PPTP,PPPOE)配置命令

    VPDN(L2TP,PPTP,PPPOE)配置命令 目  录 第1章 VPDN配置命令... 1 1.1 VPDN配置命令... 1 1.1.1 accept-dialin. 1 1.1.2 doma ...

  6. SQL Server 日常维护经典应用

    SQL Server日常维护常用的一些脚本整理. 1.sql server开启clr权限: GO RECONFIGURE GO ALTER DATABASE HWMESTC SET TRUSTWORT ...

  7. Redis操作手册

    一.Redis简介 1.1 NoSQL NoSQL,泛指非关系型数据库,NoSQL数据库分为四大类:键值存储数据库(Redis,Voldemort,Oracle BDB).列存储数据库(HBase,R ...

  8. MySQL 5.6/5.7 linux常见安装(tar,yum,script)

    该文章总结一下MySQL的常见安装方式,以tar,yum,script 三种方式来演示: 一般的公司都会有自己统一的数据库安装规范和模板,在生产环境请按照自己的规范来安装和使用,这里只演示和测试,供需 ...

  9. DOS程序员手册(九)

    第14章参考手册概述     本书余下的章节将向读者们介绍BIOS.DOS各种各样API函数和服务,作为一名程 序员,了解和掌握这些知识是很有好处的.在所介绍的参考手册中,每部手册都汇集了大 量的资源 ...

随机推荐

  1. Redo current损坏

       如果损坏的是current redo log (select group#,sequence#,archived,status from v$log;) 有两种情况: A.   数据库是正常关闭 ...

  2. JS学习笔记 - fgm练习 - 输入法下拉框 三元表达式

    <script> window.onload = function() { var oBtn = document.getElementsByTagName('input')[0]; va ...

  3. linux cmd cp -a

    cp -a 在保留原文件属性的前提下复制文件    cp -r dirname destdir   复制目录后其文件属性会发生变化 想要使得复制之后的目录和原目录完全一样,可以使用cp -a dirn ...

  4. CSS两列布局——左侧宽度固定,右侧宽度自适应的3种方法

    1.左侧绝对定位法 直接看代码: <!DOCTYPE html> <html lang="en"> <head> <meta charse ...

  5. Microsoft iSCSI Software Target 快照管理

    Microsoft iSCSI Software Target 支持快照管理,可以对设备进行手工创建快照.快照任务计划.快照回滚等操作. 首先配置iscsi 目标及设备映射关系,并在客户端通过发起程序 ...

  6. ITFriend网站内测公测感悟

    4月份做出网站Demo,就开始让用户使用了. 最初的黄色版界面,被吐槽得比较厉害. 关于界面,每个人都有自己的看法,只是喜欢和不喜欢的人比例不一样. 后来,花3400元请了个设计师,设计了一套界面,整 ...

  7. 算法 Tricks(三)—— 判断序列是否为等差数列

    判断一个数列不是等差数列,要比判断一个数列是等差数列比较容易. bool progressive = true; for (int i = 0; i < A.size() - 1; ++i){ ...

  8. Android系统开发(8)——linx进程基本概念

    一.proc文件系统 传统意义上的文件系统是用于块设备上信息的存储,/proc这个目录是一个虚拟文件系统,它放置的数据都是在内存当中,所以这个目录本身不占用任何硬盘空间.主要包含如下系统信息: 内存管 ...

  9. 编程算法 - 远征队(expedition) 代码(C)

    远征队(expedition) 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 远征队有一辆卡车须要行驶L单位的距离, 開始时, 车上有P单位的 ...

  10. Spring web 工具类 WebApplicationContextUtils

    概述 Spring web 的工具类 WebApplicationContextUtils 位于包 org.springframework.web.context.support 是访问一个Servl ...