首页 > 其他分享 >Sofia and Strings(字符串,思维)

Sofia and Strings(字符串,思维)

时间:2024-03-03 18:11:37浏览次数:18  
标签:le Sofia pos 字符串 排序 Sigma Strings

Sofia and Strings

题面

\(t\) 组数据。

每一次测试,有长度为 \(n\) 的序列 \(s\),长度为 \(m\) 的序列 \(t\)。

你可以对 \(s\) 进行两种操作:

  1. 删除 \(s_i,1\le i\le |s|\)(\(s\) 从 \(1\) 开始标号).

  2. 将 \(s_l,s_{l+1},\dots,s_r\) 排序(\(1\le l\le r\le|s|\))。

上面 \(|s|\) 是 \(s\) 的长度。

判断 \(s\) 是否可以变成 \(t\),输出 YES 或者 NO

\(1\le t\le10^4,1\le\Sigma n,\Sigma m\le2\times10^5\)。

做法

开一个二维pos数组,pos[a]这个数组中存的是所有a的下标。

处理完上面这一步后,我们再对t遍历,首先处理出t中所有有序的段,然后对于有序的段的字母数量,我们在其对应的pos中从小到大删去相应数量的下标,并且记录这里面下标的最大值,下一次删下标的时候,必须都要大于这个最大值。当数量不够的时候,就是no了。

这个做法很对,因为对于t中有序的段,我们可以通过s的子段排序后得到,但对于段与段之间,我们就只能去删,并不能排序,所以此时我们只能乖乖地从pos中按大小取了。

#include<bits/stdc++.h>
using namespace std;
void solve(){
    int n,m;cin>>n>>m;
    string a,b;cin>>a>>b;
    deque<int>pos[30];
    for(int i=0;i<n;i++)pos[a[i]-'a'].push_back(i);
    int flag=0;
    for(auto &i:b){
        if(pos[i-'a'].empty()){
            cout<<"NO\n";return ;
        }
        int temp=pos[i-'a'].front();
        pos[i-'a'].pop_front();
        for(int j=0;j<i-'a';j++){
            while(!pos[j].empty()&&pos[j].front()<temp)
                pos[j].pop_front();
        }
    }
    cout<<"YES\n";
}
signed main(){
    std::ios::sync_with_stdio(false);std::cin.tie(0);std::cout.tie(0);
    srand((unsigned)time(NULL));
    int t;std::cin>>t;while(t--)
    solve();
}

标签:le,Sofia,pos,字符串,排序,Sigma,Strings
From: https://www.cnblogs.com/shi5/p/18050392

相关文章

  • ABC343 G Compress Strings 题解
    QuestionABC343GCompressStrings给定\(N\)个字符串\(S_1,S_2,\cdots,S_N\)找到一个包含所有这些字符串作为子字符串的最小长度的字符串一个字符串\(S\)包含一个字符串\(T\)作为子字符串是指:如果\(T\)可以通过从\(S\)的开头删除零个或多个字符以及从末尾删除......
  • 代码随想录 第11天 | 20. 有效的括号 ● 1047. 删除字符串中的所有相邻重复项 ● 150.
    Leetcode:20.有效的括号-力扣(LeetCode)思路:就是用栈存左右括号,都为0就说明true,不为零说明有没有匹配成功的括号,是false,思路没有问题,时间超时了,还得用C++...,java更好的思路如下:如果是左括号,push右括号,如果是右括号,判断是否与栈顶元素匹配,JAVA//deque.isEmpty();这个方法返回......
  • 【LeetCode】1768_交替合并字符串_C
    题目描述给你两个字符串word1和word2。请你从word1开始,通过交替添加字母来合并字符串。如果一个字符串比另一个字符串长,就将多出来的字母追加到合并后字符串的末尾。返回合并后的字符串。示例示例1:输入:word1="abc",word2="pqr"输出:"apbqcr"解释:字符串合并情......
  • 字符串前面的u,r,b,f的意义
    ###字符串前面加上4个字母u,r,b,f的含义#加u后面字符串以Unicode格式进行编码,一般用在中文字符串前面,防止因为源码储存格式问题,导致再次使用时出现乱码。#加r去掉反斜杠的转移机制。#加bb""前缀表示:后面字符串是bytes类型。#加f以f开头表示在......
  • day 05-2 数据类型(字符串)
    3.字符串字符串,我们平时会用他来表示文本信息。例如:姓名、地址、自我介绍等。3.1定义v1="包治百病"v2='包治百病'v3='"包"治百病'v4="包'治百病'"V5="""吵架都是我的错,因为大家打不过。"""#三个引号,可以支持多行/换行表示一个字符串,其他的都只能在一行中表......
  • 代码随想录算法训练营day11 | leetcode 20. 有效的括号、1047. 删除字符串中的所有相
    目录题目链接:20.有效的括号-简单题目链接:1047.删除字符串中的所有相邻重复项-简单题目链接:150.逆波兰表达式求值-中等题目链接:20.有效的括号-简单题目描述:给定一个只包括'(',')','{','}','[',']'的字符串s,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右......
  • Delphi和C的类比:指针、字符串、函数指针、内存分配等
    在学习Delphi的时候,一个很好的建议是和C/C++去类比着学习,从指针,到内存管理,到数组,到面向对象……各个方面,都是有很多可以相似和或者也有不同的方,类比着学习,一方面加深对Delphi的理解,一方面加深对C/C++的理解,一方面加深对计算机系统的理解,一方面加深对面向对象的理解……由1向多可以......
  • 代码随想录 第九天 | 烤馍片(kmp)算法 ●28. 实现 strStr() ●459.重复的子字符串
    烤馍片算法(kmp):为了不让遍历的指针回退,每次不相等的时候找不相等之前的字符串的最长相等前后缀。i表示目标字符串,j表示需要在目标找到的字符串的指针。最长相等前后缀的长度就是之前有多少个与needle字符串相同,直接将j跳到上一元素位置记录的最长相等前后缀长度(next数组),这样i就可以......
  • Collapsing Strings
    做这道题目的时候学CDQ和整体二分学成傻逼了是吧?我寻思着非要把一整个数组传进去操作,明明一个一个考虑不就好了真的烦躁题外话,做这道题目的时候,探索出来一个东西,vector要放字符串的话,template可以写char*最开始的想法是编写一个函数work(vector<char*>a,vector<char*>b),然......
  • $\text{20240301}$ 字符串练习题解
    \(\text{20240301}\)字符串练习题解一定要写冬令营的题吗?遗憾的。P9717给了一个\(n\)个数的首尾相接的字符串,求若干个操作后能形成的不同的字符串大小。一次操作定义为:将字符串内所有的\(\text{01}\)同时改成\(\text{10}\),如图。通过这张图我们似乎发现了一个规律,这......