Vijos1425子串清除 题解

 
描述:
我们定义字符串A是字符串B的子串当且仅当我们能在B串中找到A串。现在给你一个字符串A,和另外一个字符串B,要你每次从B串中从左至右找第一个A串,并从B串中删除它,直到A串不为B串的子串,问你需要进行几次删除操作。
 
输入格式:
输入文件共2行,第一行一个字符串A(长度小于256),第二行一个字符串B。
30%的数据是随机生成的;
50%的数据满足输入文件大小小于300KB;
100%的数据满足输入文件小于500KB,字符串A、B中只会出现英文字母。
 
输出格式:
 
输出文件只有一个整数N。
 
样例:
 
abc
abcabcabaabcbccc
 
样例说明:
 
abcabcabaabcbccc-> abcabaabcbccc-> abaabcbccc-> ababccc-> abcc
 
分析:
刚开始看到这题时,立刻想到了KMP+双向链表的写法,但是由于代码实现比较复杂,就放弃了这个想法。
一位大神告诉我们可以用栈模拟匹配的操作,每次将元素压入栈中,看栈顶元素是否与子串匹配,如下图所示:
例如:
子串:abc
母串:abcababcc 。
第一步:
先将a入栈,不匹配;
将b入栈,不匹配;
将c入栈,匹配,并弹出栈顶相应元素,ans++ 。

第二步:
将a入栈,不匹配;
将b入栈,不匹配;
将a入栈,不匹配;
将b入栈,不匹配;
将c入栈,匹配,ans++,弹出相应元素;
 
 
 
第三步:
将c入栈,匹配,ans++,弹出相应元素;

 
以上就是用栈模拟的过程,下面代码:
 
 #include "iostream"
#include "cmath"
#include "cstdio"
#include "cstring"
#define maxN 10000010 using namespace std ;
char a[maxN], b[maxN], stack[maxN];
int Lena, Lenb; bool match ( int top )//匹配函数
{ for(int i = top, j = Lena ; i >= && j >= ; --i, --j)
{
if(a[j] != stack[i])return false ;
} return true ; } int main ( )
{
long long ans = ;
scanf("%s%s", a + , b + );
Lena = strlen(a + );
Lenb = strlen(b + );
int top = ;
for(int i = ; i <= Lenb ; ++i )
{
stack[top] = b[i];
if(stack[top] == a[Lena] && top >= Lena && match(top))
{
ans++;
top -= Lena;
}
top++;
}
printf("%I64d", ans);
return ;
}

(完)

Vijos1425子串清除 题解的更多相关文章

  1. 【37.00%】【vijos p1425】子串清除

    P1425子串清除Accepted 标签:[显示标签] 描述 我们定义字符串A是字符串B的子串当且仅当我们能在B串中找到A串.现在给你一个字符串A,和另外一个字符串B,要你每次从B串中从左至右找第一个 ...

  2. [NOIP2015] 子串substring 题解

    [题目描述] 有两个仅包含小写英文字母的字符串A和B.现在要从字符串A中取出k个互不重叠的非空子串,然后把这k个子串按照其在字符串A中出现的顺序依次连接起来得到一个新的字符串,请问有多少种方案可以使得 ...

  3. POJ 2774 Long Long Message (二分 + Hash 求最长公共子串)题解

    题意:求最长公共子串 思路:把两个串Hash,然后我们把短的作为LCS的最大可能值,然后二分长度,每次判断这样二分可不可以.判断时,先拿出第一个母串所有len长的子串,排序,然后枚举第二个母串len长 ...

  4. 【Google】循环字符串里面的独立子串

    转载自九章算法(地址) 题目: 假设s是一个无限循环的字符串”abcdefghijklmnopqrstuvwxyz”,s就是一个”...zabcdefghijklmnopqrstuvwxyza...” ...

  5. POJ2774 Long Long Message —— 后缀数组 两字符串的最长公共子串

    题目链接:https://vjudge.net/problem/POJ-2774 Long Long Message Time Limit: 4000MS   Memory Limit: 131072 ...

  6. POJ1743 Musical Theme —— 后缀数组 重复出现且不重叠的最长子串

    题目链接:https://vjudge.net/problem/POJ-1743 Musical Theme Time Limit: 1000MS   Memory Limit: 30000K Tot ...

  7. BZOJ 1396 识别子串 (后缀自动机、线段树)

    手动博客搬家: 本文发表于20181221 00:58:26, 原地址https://blog.csdn.net/suncongbo/article/details/85150962 嗯,以后博客内容 ...

  8. Codeforces 1196D2 RGB Substring (Hard version) 题解

    题面 \(q\) 个询问,每个询问给出一个字符串 \(s\),要你在 \(s\) 中用最小替换得到无穷字符串 RGBRGBRGB... 的长度为定值 \(k\) 的子串. 题解 一眼看过去可能是编辑距 ...

  9. 【SPOJ – REPEATS】 后缀数组【连续重复子串】

    字体颜色如何 字体颜色 SPOJ - REPEATS 题意 给出一个字符串,求重复次数最多的连续重复子串. 题解 引自论文-后缀数组--处理字符串的有力工具. 解释参考博客 "S肯定包括了字 ...

随机推荐

  1. ASP.NET Web Api 实现数据的分页(转载)

    转载地址:http://www.cnblogs.com/fzrain/p/3542608.html 前言 这篇文章我们将使用不同的方式实现手动分页(关于高端大气上档次的OData本文暂不涉及,但有可能 ...

  2. Linux常用命令学习1---(安装、文件系统、目录操作命令cd ls mv cp rm mkdir、链接命令ln……)

    1.理解Linux的文件系统:分区和挂载点    挂载点和路径名无关 /根目录下的/boot完全可以时独立于 /的独立的挂载点,只要你设置就可以    linux安装时候,必须要有这两个分区 / 和 ...

  3. Windows 8使用这半年(企业版)

    2014-06-23 硬件:thinkpad e430c core i5-3210m 4g/500g 1.Windows 8出现开机引导问题 主要开机的时候提示缺少引导文件,按ctrl+alt+del ...

  4. 攻城狮在路上(叁)Linux(二十三)--- linux磁盘参数修改(设备代码、设备名)

    一.mknod:设置设备代码 linux中,所有的设备都是用文件来表示,文件通过major与minor数值来判断. major为主设备代码,minor为设备代码(需要查询),示例如下: /dev/hd ...

  5. js注入

    1.JavaScript注入就是在浏览器地址栏中输入一段js代码,用来改变页面js变量.页面标签的内容. 使用Javascript注入,用户不需要关闭或保存网页就可以改变其内容,这是在浏览器的地址栏上 ...

  6. hdu 4739 2013杭州赛区网络赛 寻找平行坐标轴的四边形 **

    是平行坐标轴的,排个序搞一下就行了,卧槽,水的不行 如果不是平行的,则需要按照边长来判断

  7. C专家编程cdecl

    理解所有分析过程的代码段 Page71(中文版) 你可以轻松地编写一个能够分析C语言的声明并把他们翻译成通俗语言的程序.事实上,为什么不?C语言声明的基本形式已经描述清楚.我们所需要的只是编写一段能够 ...

  8. 驱动开发之 创建线程函数PsCreateSystemThread

    PsCreateSystemThread 创建一个执行在内核模式的系统线程. 注意:创建线程必须用函数PsTerminateSystemThread强制线程结束.否则该线程是无法自动退出的. 函数原型 ...

  9. 如何离线下载Chrome的安装包

    打开Chrome官网(自行搜索)点击下载后下载的是联网安装包,这对部分上网不方便的用户造成了一定的麻烦. http://www.google.cn/chrome/browser/desktop/ind ...

  10. felx项目属性(二)

    order flex-grow flex-shrink flex-basis flex align-self 1.1 order css order属性规定了弹性容器中的可伸缩项目在布局时的顺序.元素 ...