首页 > 其他分享 >CF1320D Reachable Strings

CF1320D Reachable Strings

时间:2023-12-15 16:45:17浏览次数:37  
标签:奇偶 int CF1320D id Reachable 字符串 maxn Strings mod

110和011互相转化,相当于就是0在连续两个1的情况下,移动两个位置

能够发现,0的位置的奇偶不会改变,且很多个0之间的相对位置不会改变

猜想考虑这个答案只跟0的奇偶性有关,下面小证一下:(注意下面所说的“奇偶”指的是两个字符串的分别第一个字母为奇数时的奇偶,不是总字符串的奇偶)

  1. 若0的相对位置奇偶不一样,显然非法

  2. 若0的相对位置奇偶一样,是否合法?假定我们把两个字符串的0都尽可能往左移动,再判断是否相等,这个方法正确性显然。

    现在假设我已经将两个字符串尽可能把0往右移动了,如果是非法情况,也就是说有一个字符串无法移动到下一个和它奇偶性相同且另外一个字符串的存在0的那个位置,那么子串不可能出现连续两个1,必然会有0将他们隔断,然后就不符合上面假设的相对位置奇偶相同了

所以,直接对奇偶比较是正确的,直接奇偶起点分别哈希就行了,实现题解有很多,具体实现注意求一段子串哈希并不能用传统的方式求

#include<bits/stdc++.h>
#define il inline 
#define maxn 200005
using namespace std;
typedef long long ll;
const int base=131;
const ll mod=998244353;
il int read(){
	char c;int x=0,f=0;
	while(!isdigit(c=getchar()))f|=(c=='-');
	while(isdigit(c))x=(x*10)+(c^48),c=getchar();
	return f?-x:x;
}
int n;
char s[maxn];
ll hs1[maxn],hs2[maxn],bs[maxn],id[maxn];
il int geths(int l,int r,int p){
	if(p)return ((hs1[r]-hs1[l-1]*bs[id[r]-id[l-1]]%mod)%mod+mod)%mod;
	else return ((hs2[r]-hs2[l-1]*bs[id[r]-id[l-1]]%mod)%mod+mod)%mod;
}
int main(){
	n=read();
	scanf("%s",(s+1));
	bs[0]=1;
	for(int i=1;i<=n;i++){
		bs[i]=(bs[i-1]*base)%mod,id[i]=id[i-1];
		if(s[i]=='1')hs1[i]=hs1[i-1],hs2[i]=hs2[i-1];
		else{
			hs1[i]=hs1[i-1]*base+1+(i&1),hs1[i]%=mod;
			hs2[i]=hs2[i-1]*base+1+((i&1)^1),hs2[i]%=mod;
			id[i]++;
		}
	}
	int t=read();
	while(t--){
		int l1=read(),l2=read(),len=read();
		int r1=l1+len-1,r2=l2+len-1;
		geths(l1,r1,l1&1)==geths(l2,r2,l2&1)?puts("Yes"):puts("No");
	}
	return 0;
}
/*
3
010
1
1 3 1
*/

标签:奇偶,int,CF1320D,id,Reachable,字符串,maxn,Strings,mod
From: https://www.cnblogs.com/blueparrot/p/17903658.html

相关文章

  • 无涯教程-Erlang - Strings(字符串)
    通过将字符串括在引号中,可以在Erlang中构造一个字符串文字,需要使用双引号(如"HelloLearnfk")构造Erlang中的字符串。-module(helloLearnfk).-export([start/0]).start()->Str1="Thisisastring",io:fwrite("~p~n",[Str1]).上面程序的输出将是-“Thisisa......
  • Strings字符串
    字符串参考视频链接:【字符串】聪明办法学Python第二版_哔哩哔哩_bilibili用两种不同的引号是为了表达一些在引号里面要用到引号的情况!字符串中的转义字符前面有反斜杠\的字符,叫做转义字符(只能作为一个字符)print("双引号:\"")双引号:"print("反斜线:\\")反斜线:\print(......
  • Count Beautiful Substrings II
    CountBeautifulSubstringsIIYouaregivenastring s andapositiveinteger k.Let vowels and consonants bethenumberofvowelsandconsonantsinastring.Astringis beautiful if:vowels==consonants.(vowels*consonants)%k==0,inothert......
  • Go标准库学习:strings和bytes
    strings包和bytes包strings包和bytes包非常像,几乎所有函数都有string和[]byte两种接口,其中前者被实现在strings包中,而后者被是现在bytes包中,所以这里将这两个包一起学习。官方文档:strings包:https://pkg.go.dev/[email protected]包:https://pkg.go.dev/[email protected]函数......
  • 无涯教程-Tcl - 字符串(Strings)
    Tcl的原始数据类型是字符串,这些字符串可以包含字母数字字符,仅数字,布尔值甚至二进制数据,Tcl使用16位Unicode字符,字母数字字符可以包含字母,包括非拉丁字符,数字或标点符号。字符串表示与其他语言不同,在Tcl中,当它只是一个单词时,不需要双引号。一个例子可以是-#!/usr/bin/tclshse......
  • 4-1898E - Sofia and Strings
    题意:题解:对于有排序操作且不限次数,最好考虑每次只对两个排序,如果t中的字母在s中的j位置,则s[0,j]之间小于t中字母的字母都要消去,用队列存s中字母的位置,扫描t,每次用s中剩余位置最小的,在消去不可用的即可。代码:点击查看代码#include<bits/stdc++.h>#defineintlonglongusi......
  • 无涯教程-D语言 - 字符串(Strings)
    字符数组我们可以用以下两种形式来表示字符数组.第一种形式直接提供大小,第二种形式使用dup方法创建字符串"Goodmorning"。char[9]greeting1="Hellolearnfk";char[]greeting2="Goodmorning".dup;这是使用上述简单字符数组形式的简单示例。importstd.stdio;voidm......
  • Ozon Tech Challenge 2020 (Div.1 + Div.2, Rated, T-shirts + prizes!) B. Kuroni an
    Problem-1305B-Codeforces 啦啦啦,这题题目有点长,概括一下就是,希望将所有()匹配的括号去掉问你需要操作多少次 双指针,一个i一个j,从前往后记录匹配的括号如果发现:1.括号匹配2.i<jok,就放入ans (⊙o⊙)…,最后记得sort一遍ans,第一遍因为这个wa了一发 #include......
  • Strings of Impurity
    link不懂为什么都写平衡树,明明set就好了啊,思路跟平衡树差不多,实现起来较为简单。intn,m,k;ints[N];strings1,s2;intcnt[N];vector<int>t;set<int>p[N];intmain(){ios::sync_with_stdio(false);cin.tie(nullptr); cin>>s1>>s2; n=s1.size()......
  • linux 中 strings命令
     001、linux中strings命令主要是在对象文件或者二进制文件中查找可打印的字符串。 002、举例(base)[b20223040323@admin1~]$strings/bin/ls|head/lib64/ld-linux-x86-64.so.2libselinux.so.1__gmon_start___initfgetfileconfreeconlgetfilecon_finilibc......