首页 > 其他分享 >CF305E Playing with String

CF305E Playing with String

时间:2024-08-07 18:49:52浏览次数:5  
标签:CF305E String int 位置 Playing 关键 操作 include RI

难点在于读题发现 \(l\) 总取 \(1\) 即可,然后稍加转换就变成个傻逼题了

有个显而易见的 \(O(n^3)\) 的区间 DP 做法,即考虑记录每个区间的 SG 函数值,然后枚举分界点转移

但仔细思考我们会发现能进行操作的只有初始时 \(s_{i-1}=s_{i+1}\) 的位置,并不会经过某些操作后使得一个本来不能操作的位置变得可以操作了

因此我们只需要考虑所有初始时 \(s_{i-1}=s_{i+1}\) 的位置,不妨称这些位置为关键位

手玩下会发现不相邻的两个关键位之间是完全独立的,不会相互影响;反之相邻的关键位会因为其中某个位置操作后导致相邻的位置不能操作

因此我们只关心相连的一段关键位的长度,令 \(f_x\) 表示长为 \(x\) 的关键位对应的 SG 函数,转移暴力枚举所有后继状态即可

总复杂度 \(O(n^2)\)

#include<cstdio>
#include<iostream>
#include<cstring>
#define RI register int
#define CI const int&
using namespace std;
const int N=5005;
int n,sg[N],vis[N],key[N],L[N],R[N]; char s[N];
int main()
{
    scanf("%s",s+1); n=strlen(s+1);
    for (RI i=1;i<=n;++i)
    {
        memset(vis,0,sizeof(vis));
        for (RI j=1;j<=i;++j)
        {
            int x=max(0,j-2),y=max(0,i-j-1);
            vis[sg[x]^sg[y]]=1;
        }
        int mex=0; while (vis[mex]) ++mex;
        sg[i]=mex;
    }
    for (RI i=2;i<n;++i) if (s[i-1]==s[i+1]) key[i]=1;
    int ret=0; for (RI i=1,j;i<=n;)
    {
        if (!key[i]) { ++i; continue; }
        for (j=i;j<=n&&key[j];++j);
        ret^=sg[j-i]; i=j;
    }
    if (ret==0) return puts("Second"),0;
    for (RI i=1;i<=n;++i) if (key[i-1]) L[i]=L[i-1]+1; else L[i]=0;
    for (RI i=n;i>=1;--i) if (key[i+1]) R[i]=R[i+1]+1; else R[i]=0;
    puts("First");
    for (RI i=1;i<=n;++i) if (key[i])
    {
        int x=max(0,L[i]-1),y=max(0,R[i]-1);
        if ((ret^sg[L[i]+R[i]+1]^sg[x]^sg[y])==0) return printf("%d",i),0;
    }
    return 0;
}

标签:CF305E,String,int,位置,Playing,关键,操作,include,RI
From: https://www.cnblogs.com/cjjsb/p/18347643

相关文章

  • 【C++】string类
    ......
  • es6-string-html vscode插件 js里面template的高亮插件 无构建vue使用
    es6-string-htmlvscode插件js里面template的高亮插件无构建vue使用这个插件可以让js里面的template的字符串高亮,前面加/*html*/Refference:无构建和打包,浏览器直接吃上Vue全家桶?https://juejin.cn/post/7399094428343959552......
  • JAVA基础:String的常用方法
    目录前言string的常用方法前言上一篇我们学习了string字符串的基本用法,以及string字符串的内部机制,而string也是一个类,他的内部也有很多已经给我们封装好的,方便我们操作字符串的方法,我们是不可能将内部的方法全部记住的,我们只要知道方法是怎么使用的有什么样的效果就行,......
  • 常用API_1:应用程序编程接口:String
    文章目录包packageString注意==和equals()String的对象是不可变的对象双引号""方式写出的字符串对象常用方法使用String来开发验证码代码运行结果反思包package同一个包下的程序可以直接访问访问其他包下的程序必须导包才能访问Java.lang包可以不用导,直接使用eg......
  • C++学习笔记----Strings与String View(4)-- 字符串操作
        今天讲点简单易懂的,字符串操作,当然了,不是全部,列出几个典型的字符串操作,完整地可以参考相关资料,网上一搜一把哦。substr(pos,len):返回特定位置pos,特定长度的子字符串。find(str):返回字符串的位置,如未找到则返回string::npos。replace(pos,len,str):用新的字符串str......
  • C++学习笔记----Strings与String View(5)-- 字符串文本
    今天我们继续来学习C++的string:1、字符串文本    字符串文本通常会被解析成字符指针常量(constchar*)或者字符数组常量(constchar[]),如果想要达到声名std::string常量的目的,则需要在声明时在常量字符串后加一个s,示例如下: autostring1{"HelloWorld"}; //string1为......
  • Java包装类;字符串处理类:String;StringBuffer;StringBuilder;字符串处理类的常用方法;异常
    一,包装类      什么是包装类:         包装类是对于八种基本数据类型而言的,八种数据类型都有其对应的包装类。         以前定义变量,经常使用基本数据类型,对于基本数据类型来说,它就是一个数,加点属性,加点方法,加点构造器。  ......
  • String类
    String类字符串常量池在Java中,字符串常量池(StringPool)是一个特殊的存储区域,用于存储字符串字面量(literalstrings),以节省内存和提高性能。字符串常量池的概念在Java7及以后的版本中有所变化,但基本原理相同。字符串常量池的基本概念:存储位置:在Java7及之前,字符串常量......
  • StringBuffer和StringBuilder
    StringBuffer和StringBuilder在Java中,StringBuffer和StringBuilder是两个用于字符串操作的类,它们都继承自AbstractStringBuilder类。这两个类提供了一种可变的字符序列,可以用来构建和修改字符串。StringBuffer和StringBuilder的共同点:两者都可以用来创建一个可变的字......
  • String,StringBuilder,StringBuffer
    目录String类创建字符串字符串长度连接字符串创建格式化字符串字符串常量池常见方法charAt(intindex)startWith()endsWithsubstring()split()trim()concat()正则表达式正则表达式实例字符通配符次数通配符其他通配符java.util.regex包捕获组StringBuffer和StringBuilderStringBu......