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

样例输出

5

在拿到这道题后,看到字符串匹配,就在第一时间想到了kmp+链表,但写起来过于复杂,通过栈我们可以大大降低代码的长度。

首先,我们将字符串b从左到右的压入栈中。

ans=0;

如果当前的栈顶元素与字符串a的最后一个字符相等,我们便做一次匹配。

若匹配成功,将答案数加1,将栈中的前lena(字符串a的长度)个元素出栈。

ans++;top-=lena;

继续将字符串b入栈,直到栈顶与a[lena]相等。

进行匹配。

ans++;top-=lena;

通过循环持续进行这个操作。

ans++;top-=lena;

当字符串b全部进栈且不能与a匹配后后,我们已匹配的次数便是本题要求的答案。

注意:这道题中,在字符串b中删去a后,前一部分与后一部分有可能仍需删除。

例如:

abc

bababccc->babcc->bc

通过栈可以解决这一问题,因为我们每次是从最后一位开始匹配,对于字符串b中已经入栈的每一个a[lena],我们已经对以它为结尾的子串进行过匹配。

代码如下:

 1 #include <cstdio>
 2 #include <cstring>
 3 int lena,lenb,top,ans;
 4 char stack[10000001],a[10000001],b[10000001];
 5 bool cmp(int j)//匹配a与栈。
 6 {
 7     for(int i=lena;i>=1&&j>=1;i--,j--)
 8     {
 9         if(a[i]!=stack[j])return false;
10     }
11     return true;
12 }
13 int main()
14 {
15     scanf("%s",a+1);
16     scanf("%s",b+1);
17     lena=strlen(a+1);
18     lenb=strlen(b+1);
19     top=1;
20     for(int i=1;i<=lenb;i++)
21     {
22         stack[top]=b[i];
23         if(stack[top]==a[lena]&&top>=lena&&cmp(top))//当栈顶元素与字符串a的最后一项相等时,进行匹配。
24         {
25             ans++;//答案数加1.
26             top-=lena;//弹出栈顶元素。
27         }
28         top++;
29     }
30     printf("%d",ans);
31     return 0;
32 }
时间: 2024-08-02 18:56:59

Vijos1425题解---栈的相关文章

括号画家

# 题意 一共有3种括号,空的括号是美观的(1) 空的括号序列是美观的:(2) 若括号序列A是美观的,则括号序列 (A).[A].{A} 也是美观的:(3) 若括号序列A.B都是美观的,则括号序列AB也是美观的.例如 [(){}]() 是美观的括号序列,而)({)[}]( 则不是.现在达达想在她绘制的括号序列中,找出其中连续的一段,满足这段子序列是美观的,并且长度尽量大. # 题解 栈中保存前括号的下标,扫描,匹配上时出栈,不匹配跳过,若栈不空,用当前下标减栈中中标,因为当前未匹配入展,所以不合

七方件业金离以提领前群约会ODjdidtlwfWv

为了从不同环节,尤其与广大使用人群直接关系的环节反映质量状况,对共享自行车投放点.运营仓库.生产企业等不同环节的产品抽查,覆盖了共享自行车从成品出厂到待投放的关键环节. 该负责人称,根据新车投放情况,结合共享自行车行业市场占有分布特点,本次重点抽查了摩拜.ofo.Hellobike三个品牌的产品,占本次抽查批次总数的83.3%.其中,在天津.无锡.武汉.广州.深圳.东莞6个城市抽查了9批次摩拜产品,占产品抽查批次总数的37.5%,抽查批次合格率88.9%,抽查不合格的1批次产品为待投放于广州市的

Vijos1425子串清除 题解

Vijos1425子串清除 题解 描述: 我们定义字符串A是字符串B的子串当且仅当我们能在B串中找到A串.现在给你一个字符串A,和另外一个字符串B,要你每次从B串中从左至右找第一个A串,并从B串中删除它,直到A串不为B串的子串,问你需要进行几次删除操作. 输入格式: 输入文件共2行,第一行一个字符串A(长度小于256),第二行一个字符串B. 30%的数据是随机生成的: 50%的数据满足输入文件大小小于300KB: 100%的数据满足输入文件小于500KB,字符串A.B中只会出现英文字母. 输出格

leetcode题解:Valid Parentheses(栈的应用-括号匹配)

题目: Given a string containing just the characters '(', ')', '{', '}', '[' and ']', determine if the input string is valid. The brackets must close in the correct order, "()" and "()[]{}" are all valid but "(]" and "([)]&

HDU 1022 Train Problem I 模拟栈题解

火车进站,模拟一个栈的操作,额外的栈操作,查看是否能按照规定顺序出栈. 数据量很少,故此题目很容易AC. 直接使用数组模拟就好. #include <stdio.h> const int MAX_N = 10; char inOrder[MAX_N], outOrder[MAX_N], stk[MAX_N]; bool rs[MAX_N<<2]; int n; int main() { while (scanf("%d", &n) != EOF) { s

[NOIP2003]栈 题解(卡特兰数)

[NOIP2003]栈 Description 宁宁考虑的是这样一个问题:一个操作数序列,从1,2,一直到n(图示为1到3的情况),栈A的深度大于n. 现在可以进行两种操作: 1.将一个数,从操作数序列的头端移到栈的头端(对应数据结构栈的push操作) 2.将一个数,从栈的头端移到输出序列的尾端(对应数据结构栈的pop操作) 使用这两种操作,由一个操作数序列就可以得到一系列的输出序列; 你的程序将对给定的n,计算并输出由操作数序列1,2,-,n经过操作可能得到的输出序列的总数. Solution

算法(第四版)C#题解&mdash;&mdash;1.3.49 用 6 个栈实现一个 O(1) 队列

因为这个解法有点复杂,因此单独开一贴介绍. <算法(第四版)>中的题目是这样的: 1.3.49 栈与队列.用有限个栈实现一个队列,保证每个队列操作(在最坏情况下)都只需要常数次的栈操作. 那么这里就使用六个栈来解决这个问题. 这个算法来自于这篇论文. 原文里用的是 Pure Lisp,不过语法很简单,还是很容易看懂的. 先导知识--用两个栈模拟一个队列 如何使用两个栈来模拟一个队列操作? 这是一道很经典的题目,答案也有很多种,这里只介绍之后会用到的一种方法. 首先我们有两个栈,H 和 T,分别

【STL】栈+队列+优先队列(详)+ 拯救行动题解

一.栈 栈(stack)又名堆栈,它是一种运算受限的线性表.其限制是仅允许在表的一端进行插入和删除运算.这一端被称为栈顶,相对地,把另一端称为栈底.向一个栈插入新元素又称作进栈.入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素:从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素. 说通俗一点,就是一种有口无肛门的数据结构 咳咳...是一种满足"后进先出"规则的数据结构.有PUSH和POP两种操作.PUSH:把元素压入栈顶 POP:把元

【基础练习】【栈】【映射】codevs3543 括号匹配题解

本来这是一道水题,结果因为我有些大意,弄了一个小时···引以为戒. 这道题比较特殊的一点是四种括号如果存在嵌套必须按照一定的顺序嵌套. 放代码 //codevs3543 括号匹配 #include<stack> #include<cstring> #include<cstdio> #include<map> using namespace std; map<char,int> low; stack<char> s; int n; bo