首页 > 其他分享 >String Game 题解

String Game 题解

时间:2023-08-05 19:15:25浏览次数:38  
标签:二分 String int 题解 字母 long Game removed

题目传送门

一道二分题。

\(|p|\le2\times10^6\),考虑 \(O(n\log n)\) 的算法,而又要输出最大值,不难想到二分答案。

二分删除字母的数量,用一个数组将删掉的字母的下标存起来,然后判断删除字符后的 \(t\) 是否是 \(p\) 的子序列即可。

Code

#include <bits/stdc++.h>
#define ll long long
#define INF 1e9
using namespace std;
string t, p;
int ans;
int a[200005];
bool removed[200005]; // removed[i] 表示 i 下标上的字母已被删除
bool check(int x) {
    if (x > t.size()) return 0;
    int cnt = 0;
    memset(removed, 0, sizeof(removed));
    for (int i = 1; i <= x; i++) removed[a[i]] = 1;
    for (int i = 0; i < t.size(); i++) {
        if (removed[i + 1]) continue; 
        if (t[i] == p[cnt]) cnt++;
    }
    if (cnt == p.size()) return 1; 
    return 0;
}
void f(int l, int r) {
    while (l <= r) {
        int mid = (l + r) / 2;
        if (check(mid)) {
            l = mid + 1;
            ans = mid; // 求最大值
        }
        else r = mid - 1;
    }
}
signed main() {
    ios :: sync_with_stdio(0);
    cin >> t >> p;
    for (int i = 1; i <= t.size(); i++) cin >> a[i];
    f(1, 200000);
    cout << ans;
    return 0;
}

标签:二分,String,int,题解,字母,long,Game,removed
From: https://www.cnblogs.com/xvl-/p/17608428.html

相关文章

  • Painting the Fence 题解
    题目传送门一道枚举题。我们可以直接枚举那\(2\)个去掉的粉刷匠。先统计一下每个栅栏会被多少个粉刷匠刷到,然后枚举第一个被去掉的粉刷匠,然后计算剩下的粉刷匠会将每个栅栏刷到多少次,我们只需要看只能被刷\(1\)次的栅栏就行了。接着处理一个前缀和数组,记录前\(i\)个栅栏......
  • Vanya and Brackets 题解
    题目传送门一道枚举题。枚举左括号和右括号的位置括号,为了答案最优,左括号只能在开头或者*的右边。右括号只能在末尾或者*的左边。每一次枚举都计算一下这个加了括号后表达式的值,最后取最大值即可。Code#include<bits/stdc++.h>#definelllonglong#defineINF1e9usi......
  • Permutations 题解
    题目传送门一道枚举题。数据范围非常小,考虑暴力枚举全排列。可以dfs两次,第一次求出能使\(f(p)\)取得的最大值。第二次求出第\(m\)个排列。注意一下,第二次dfs的时候需要按字典序枚举。Code#include<bits/stdc++.h>#definelllonglong#defineINF1e9usingname......
  • Prefixes and Suffixes 题解
    题目传送门一道字符串题。我们考虑还原字符串后再一个一个的判断。很显然,这个字符串是由一个长度为\(n-1\)的前缀和后缀组成的。因此我们可以找到这\(2\)个长度为\(n\)的字符串,然后枚举哪个是前缀,哪个是后缀。值得注意的是,当你判断一个字符串为前缀时,如果后面出现了同样......
  • String、StringBuilder和StringBuffer
       ......
  • C# 如何调用C++ dll string类型返回
    这篇文章主要介绍了C# 如何调用C++ dll string类型返回问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教 −目录C#调用C++dllstring类型返回C++端:(定义返回数据为结构体Vector4)C#端:(接收返回的结构体Vector4)C#调用C++dll类型......
  • Educational Codeforces Round 151 (Rated for Div. 2) 题解
    A.ForbiddenInteger显然,当\(x\not=1\)时,直接输出\(n\)个\(1\)即可否则,如果\(n\)为奇数,那就输出\(\lfloor\frac{n}{2}\rfloor-1\)个\(2\)和\(3\);如果\(n\)为偶数,那就输出\(\frac{n}{2}\)个\(2\)(要看一下\(k\)的大小)B.ComeTogether因为Bob和Carol都......
  • 恋爱入门教学题解
    已知长度为\(n\)的三个两个实数序列\(A,B,X\),定义\(n\)个定义域为\(\R\)的函数\(f_1,f_2,\cdots,f_n\)。其中:\[f_k(x)=\sum_{i=1}^k|a_i(x-x_i)+b_i|\]现在,对于每一个\(k=1,2,\cdots,n\),求\(f_k\)的最小值。可以证明,最小值一定存在。\(n\le......
  • FJOI 树的重心题解
    从零开始暴切省选题题意简述给定一个\(n\)个点的树,每个点的编号从\(1\)至\(n\),问这个树有多少不同的连通子树,和这个树有相同的重心。分析1求重心首先要明确重心的定义。题目中给出:删掉某点\(i\)后,若剩余\(k\)个连通分量,那么定义\(d(i)\)为这些连通分量中点的个数......
  • P4850 [IOI2009] Raisins 题解
    前言:IOI还出这样水的纯记忆化搜索题?还是T4?真令人难以置信。题意:题目传送门一个N×M的矩阵,对于任意一个子矩阵,只能横着或竖着分割,并且分割一次的价值为改子矩阵的元素之和,现要将该矩阵分割成1×1的方格,求最小的分割总价值之和。思路:看到这是个最优化的题,且数据范围很......