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. 9、str类型和byte类型转换、列表拾遗、元组拾遗、字典拾遗、如何判断对象是否可迭代

    str(字节类型,编码)       可用于创建字符串,或者将其他的转换成字符串 a= ‘李露’ #将字符串转换成字节流 b = bytes(a,encoding = 'utf-8') #将字节转换成 ...

  2. C语言深度剖析-----函数与指针的分析

                          指针的本质 指针需要保证指向任意数据类型,所以指针变量都占用32位bit即4字节. PS:不同机器上,指针占用内存不一                   ...

  3. 【hdu 6208】The Dominator of Strings

    [链接]h在这里写链接 [题意] 问你n个串里面有没有一个串,使得其余n-1个串都是他的子串. [题解] 后缀数组. 答案肯定是那个最长的串. 则,把那个串求一下Sa数组(注意仅仅那个最长的串求). ...

  4. python使用matplotlib画图

    python使用matplotlib画图 matplotlib库是python最著名的画图库.它提供了一整套和matlab类似的命令API.十分适合交互式地进行制图. 先介绍了怎样使用matplotl ...

  5. js如何生成[n,m]的随机数

    js如何生成[n,m]的随机数 一.总结 一句话总结:生成随机数就是用的Math的random方法. 1.Math.random()得到的数据的左右开闭情况是怎样的? 左闭又开 所以Math.floo ...

  6. php实现求链表中倒数第k个节点

    php实现求链表中倒数第k个节点 一.总结 $head = $head->next; //1.将$head节点next域里面的记录的那个地址值($head节点的下一个节点的地址)给$head,$ ...

  7. Size Balanced Tree(SBT树)整理

    不想用treap和Splay,那就用SB树把,哈哈,其实它一点也SB,厉害着呢. 先膜拜一下作者陈启峰.Orz 以下内容由我搜集整理得来. 一.BST及其局限性 二叉查找树(Binary Search ...

  8. hdu 1166 敌兵布阵 线段树 点更新

    // hdu 1166 敌兵布阵 线段树 点更新 // // 这道题裸的线段树的点更新,直接写就能够了 // // 一直以来想要进线段树的坑,结果一直没有跳进去,今天算是跳进去吧, // 尽管十分简单 ...

  9. 最简单的基于FFmpeg的AVUtil样例 (AVLog, AVOption等)

    本文的演示样例程序记录了FFmpeg的libavutil中几种工具函数的用法: AVLog:日志输出AVOption (AVClass):选项设置AVDictionary:键值对存储ParseUtil ...

  10. js javascript正则

    var re = new RegExp("^[0-9]$"); 或者 var re2 = /^\d$/;//这个好像兼容性更好,比如你在上面的语句里面写\d,就总是返回false, ...