首页 > 其他分享 >[题目记录]一本通高手训练-石环

[题目记录]一本通高手训练-石环

时间:2024-12-07 12:59:12浏览次数:6  
标签:高手 相等 题目 int 元素 相邻 石环 首尾 define

题意

有一个首尾相连的环 , 元素依次是 \(a_1 \cdots a_n\) .

对于每个 \(0\le k< n\) , 回答是否存在删除 \(k\) 个相邻元素的方案 , 使得删除后的环相邻元素不相等 ( 包括首尾元素 ) .

\(n\le 10^6\) .


题解

必要地简化一下问题 , 先把原串复制一遍接在后面表示环 , 删除 \(k\) 个相当于在新的串上保留一个 \(n-k\) 的区间 . 因此只考虑是否能找出长为 \(k\) 的子区间使相邻元素不相等 .

先考虑除了首尾之外不相等 , 发现原来串上相邻相等的位置不可能出现在同一个区间里 , 在这样的位置分段 , 可以把原串分成若干段 , 保证在这些段内取除首尾之外相等 .

然后只需保证首尾的元素不相等 , 发现对于长度 \(k\) , 所有长度 \(k\) 的首尾都相等 , 相当于长度为 \(len-k+1\) 的前后缀相等 , 于是转化成 $\mathrm{KMP} $ 问题 .

点击查看代码
#include<bits/stdc++.h>
#define file(x) freopen(#x ".in","r",stdin),freopen(#x ".out","w",stdout)
#define ll long long
#define INF 0x7fffffff
#define INF64 1e18
using namespace std;

constexpr int N=2e6+5;

int n,f[N];
string s;
int res[N];

void check(int l,int r){
	f[1]=0;
	int j=0;
	for(int i=2;i<=r-l+1;i++){
		while(j&&s[l-1+j]!=s[l+i-2]) j=f[j];
		if(s[l-1+j]==s[l+i-2]) j++;
		f[i]=j;
	}
	for(int i=1;i<=r-l+1;i++) res[i]++;
	while(j) res[r-l+1-j+1]--,j=f[j];
}
int cnt;

void solve(){
	memset(res,0,sizeof res);
	n=s.length();
	s=s+s;
	int last=1;
	for(int i=1;i<2*n;i++){
		if(s[i]==s[i-1]){
			check(last,i);
			last=i+1;
		}
	}
	check(last,2*n);
	cout<<"Case "<<cnt<<": ";
	for(int i=0;i<n;i++)
		if(res[n-i]) cout<<1;
		else cout<<0;
	cout<<'\n';
}

int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	while(cin>>s){ cnt++;solve();}
}


总结

  • 进行一切能简化问题的转化 , 以给后面看出真正的做法做铺垫 .
  • 先考虑简单的不包含首尾的部分 , 然后只研究首尾相等 , 得出正确的方法 .

标签:高手,相等,题目,int,元素,相邻,石环,首尾,define
From: https://www.cnblogs.com/youlv/p/18592015

相关文章

  • c语言题目 之 杨氏矩阵
    杨氏矩阵,就是行和列里面的值都是越来越大的;第一种:通过结构体将坐标带回第二种:通过指针将坐标带回//方法一:structpoint{ intx; inty;};structpointserch_(int(*p)[4],intr,intc,intn){ intx=0; inty=c-1; structpointrety={-1,-1}; ......
  • List接口介绍和题目演练
    List接口介绍、定义及特点在Java中, List 接口是 java.util 包中的一部分,它继承自 Collection 接口。一、定义和特点定义和特点1. 有序集合- List 中的元素是有序的,这意味着可以通过索引(位置)来访问元素,索引从0开始。例如,在一个 List 中添加元素的顺序是 a 、 b......
  • P6815 [PA2009] Cakes 题目分析
    P6815[PA2009]Cakes题目分析题目链接分析题目性质本质上是求三个点组成的环的点权最大值的和。思路暴力考虑枚举第一个点\(i\),然后枚举与其相邻的第二个点\(j\),用\(set\)存储\(i,j\)相连的点,最后判断得出答案。代码如下:#include<iostream>#include<cstdio>#i......
  • C语言的 一些题目
    1、运算中的整形提升intmain(){ unsignedchara=200; unsignedcharb=100; unsignedcharc=0; c=a+b; printf("%d%d",a+b,c);}如下:intmain(){ unsignedchara=200; //200和100是整形 //00000000000000000000000011001000 //11001000......
  • 真题-桂城2017年六年级(答案+题目)
    今天我给大家出一套C++真题-桂城2017年六年级考题限时2.5小时,大家加油!!!题目1:更多闰年题目描述在smoj网站上,有很多针对小学信息学入门的课程,把这些入门课程的题都刷一遍并理解之后,你就算正式的信息学选手啦。例如课程9的某一道题是这样的:输入两个正整数a和b,表......
  • 揭秘销售高手的语言艺术:精准触动顾客心弦的策略
    许多人误以为销售只需擅长言谈便能胜任,实则不然。关键在于能否言之有物,每句话都能精准触动客户的心弦。销售精英实为聊天的艺术大师,其衡量标准在于能否有效说服并打动顾客。面对多样化的客户群体,我们需要灵活调整语言风格,即便是同一款产品,也应根据不同情境变换介绍方式。接下来,让......
  • 前端热门面试题目(四)——计算机网路篇
    计算机网络常见面试题:计算机网络面试(一)计算机网络面试(二)计算机网络速成:计算机网络速成一计算机网络速成二计算机网络速成三2.HTTP1.0和2.0的区别连接复用:HTTP/1.0使用短连接(默认每个请求创建一个TCP连接)。HTTP/2.0支持多路复用,一个TCP连接可以并发处......
  • 前端热门面试题目——React、Node
    img标签的srcset属性的作用srcset属性允许开发者为不同设备或分辨率提供多个图像选项,优化加载的图片以适应设备的屏幕大小和分辨率。这提高了性能和用户体验。示例:<imgsrc="default.jpg"srcset="small.jpg480w,medium.jpg1024w,large.jpg1600w"s......
  • [题目记录]一本通高手练习-软件开发
    题意有两个软件需要开发,每个软件分为\(m\)部分,把这总共\(2m\)个任务分配给\(n\)个人,每个人完成软件1,软件2的一部分所消耗的时间分别为\(a_i,b_i\),这\(n\)个人同时工作,完成的时间就是这\(n\)个人最慢的一个人完成他的所有任务的时间.通过分配任务......
  • [题目记录]一本通高手训练-塔
    题意有\(n\)个数,每次可以合并相邻两个数为一个数,新的数的值是原来两个数的和.求最小操作次数,使得序列变为不降序列.\(case1:n\le3000\)\(case2:n\le1e5\)题解做法一一本通上给到的一种做法.首先设计状态\(f_{i,j}\)当前位置\(i\),上一次转移......