首页 > 其他分享 >CF1670B Dorms War 题解

CF1670B Dorms War 题解

时间:2024-04-10 21:46:02浏览次数:25  
标签:Dorms ch 题解 ll CF1670B p1 include buf 特殊字符

题面

不好意思,把这道题的通过率拉低了,但坑点确实有。

思路

多出几个数据,我们可以发现,在不报警的前提下,最多可以操作数量是两个特殊字符间的最长距离

解释

对于不报警的定义是:每次删除操作进行前,当前的字符串中的所有特殊字符的前一个位置必须不是特殊字符。

换句话说,只要当前字符串的任意一个特殊字符前仍有不是特殊字符的字符,就不会报警。

所以找到初始字符串中两个特殊字符间的最长距离,就是最多操作次数。设这两个字符的位置分别是 \(i\),\(j\),满足 \(1 \le i < j \le n\),那么最长操作数量就是 \(j - i\)。

为什么不是 \(j - i + 1\) 呢?因为操作到第 \(j - i\) 次时,距离最长的这两个特殊字符都已经贴在一起了,下一次操作必定会报警,故最长操作数量是 \(j - i\)。

代码

吐槽一句,原先的两篇题解给出的代码都超时了,别问我怎么知道的。

细节

在输入时,如果直接将 \(k\) 个字符读入的话会超时(不知道怎么回事)。因此在读入 \(k\) 时加了一点小优化,将后面的空格符也读入。(在这里被卡了好久,以后再也不想用 cin 了。

代码实现

#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cstring>
#include<algorithm>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
#define ll long long
#define inf 0x3f3f3f3f
#define fr(i , a , b) for(register ll i = a ; i <= b ; ++i)
#define fo(i , a , b) for(register ll i = a ; i >= b ; --i)
#pragma comment(linker , "/stack : 200000000")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
using namespace std;
inline char gchar()
{
    static char buf[1000000] , *p1 = buf , *p2 = buf;
    return p1 == p2 && (p2 = (p1 = buf) + fread(buf , 1 , 1000000 , stdin) , p1 == p2) ? EOF : *p1++;
}
inline ll read()
{
    register ll x = 0 , f = 1;
    char ch = getchar();
    while(ch < '0' || ch > '9')
	  {
        if(ch == '-')
        {
        	f = -1;
		}
        ch = getchar();
    }
    while(ch >= '0' && ch <= '9')
	  {
        x = (x << 1) + (x << 3) + (ch ^ 48);
        ch = getchar();
    }
    return x * f;
}
ll T , n , k;
char s[100005] , ch;
ll t[27] , last , max_dis;
signed main()
{
    T = read();
    while(T--)
    {
        max_dis = 0;
        fr(i , 0 , 26)
        {
            t[i] = 0;
        }
        n = read();
        scanf("%s" , s + 1);
        k = read();
        fr(i , 1 , k)
        {
            scanf("%c" , &ch);
            getchar();
            t[ch - 'a'] = 1;
        }
        last = 1;
        fr(i , 1 , n)
        {
            if(t[s[i] - 'a'])
            {
                max_dis = max(max_dis , i - last);
                last = i;
            }
        }
        printf("%lld\n", max_dis);
    }
    system("pause");
	return 0;
}

标签:Dorms,ch,题解,ll,CF1670B,p1,include,buf,特殊字符
From: https://www.cnblogs.com/xhqdmmz/p/18127547

相关文章

  • CF1817A Almost Increasing Subsequence 题解
    题面。2023.5.18修正关于前缀和数组的说法,与代码适配的思路。题意给定长度为\(n\)一个序列\(a\)以及\(q\)次询问,每次询问给出\(l\)和\(r\),要求找出序列\(a\)在\([l,r]\)内最长的几乎递增子序列。对于几乎递增的定义:如果一个序列中不存在连续的三个数\(x\),\(y\)......
  • CF1737C Ela and Crickets 题解
    题面。原先大佬的题解写的很好,但这里想讲一下不同做法。思路题目中说的\(L\)型有四种情况,很容易就可以想到特殊情况,那就是\(L\)型恰好贴在棋盘的四个角上,这时我们发现,这样子棋子只能在棋盘的其中两条边上移动。对于四个角我们进行四次特判。看普通情况,在手动模拟完样例后......
  • CF1162B Double Matrix 题解
    传送门说句实话,如果不是先写了Showstopper这道题的话,我应该会在这里卡很久,因为做Showstopper我就卡了很久QwQ。思路太像了,实在是太像了,与Showstopper想比,仅仅就是换成二维数组,求最大值变为找递增矩阵,处理方法一模一样:将数组\(a\)和\(b\)中较小的值存在一个数组里,较......
  • 【华为笔试题汇总】2024-04-10-华为春招笔试题-三语言题解(Python/Java/Cpp)
    ......
  • 关于淘宝镜像过期问题解决方案
    问题:将项目拷贝到另一台电脑启动时报错Error:Theprojectseemstorequireyarnbutit'snotinstalled解决方法:1.删除项目中的yarn.lock文件2.终端执行npminstall-gyarn再次启动项目npmrunserve就可以了......
  • Codeforces Round 938 (Div. 3) A-H 题解
    A-YogurtSaleSolution当\(2a>b\)时,显然用\(a\)来买两个比较好,否则就用\(b\)来买两个比较好Code#include<bits/stdc++.h>usingnamespacestd;voidsolve(){intn;cin>>n;inta,b;cin>>a>>b;b=min(b,a*2);int......
  • AT_agc038_e [AGC038E] Gachapon 题解
    比较基础的一道题。很容易想到Min-Max容斥:\[E(\max(S))=\sum_{T\subeS}(-1)^{|T|-1}\timesE(\min(T))\]然后发现\(E(\min(T))=\sum_{k\ge0}P(\min(T)\gek)\)。考虑dp,记\(f_{i,j,k}\)表示从前\(i\)个数中选出\(T\),\(\sum_{i\inT}A_i=j,\sum_{i\inT}c_i=k\)且每个......
  • MHY1001. [崩三]椰子树题解
    #include<bits/stdc++.h>usingnamespacestd;constintN=1010,M=20010;intq[M];//s的最大值为20000,v的最小值为1,所以队列里面最多是会有200010个元素的intn,m;intf[M],g[M];intmain(){cin>>n>>m;for(inti=1;i<=n;++i){......
  • CF1804C Pull Your Luck 题解
    题面。翻译清晰,这里就不吐槽了。根据轮盘转动的方法,可以看出这是一个简单的高斯求和。因为这是一个轮盘,在轮盘中转动了\(now\)个格子与转动了\(now\bmodn\)所到达的格子是一样的(这就没必要证明了吧),因此我们很容易就能得到一个最朴素的代码: cin>>T; while(T--) { c......
  • P3891 [GDOI2014] 采集资源 题解
    题面。看到大家都是两个动态规划的写法,来给大家讲一下只用一次动态规划的写法。思路设\(f_{i,j}\)表示工作效率为\(i\),获取\(j\)点资源所需的最短时间,不以苦工设状态是因为苦工会因为后面购买而改变,不太现实。\(tme\)表示答案,即到达\(t\)点资源所需的最短时间。从\(0......