CF1430 D. String Deletion(div 2)
题目链接:http://codeforces.com/contest/1430/problem/D
题意:有一个长度为n(n<=2*10^5)的01字符串,每轮操作有两步:
第一步是删去字符串中任意一个字符;
第二步是删去字符串中的相同前缀串(例如:1100100 删去前两个1);
求最多可以进行几轮。
思路:首先我们可以很容易的知道删去前后有一个(或两个)与其相同的字符是最优的(且不为第一个字符),因为此时不会使第二步操作删掉的字符增加
所以我们就想到了贪心,每轮操作都遍历一遍找到满足要求的字符(特殊的,若无满足要求的字符则删掉第一个字符),用双向指针维护前后的字符位置
可是!!!此时复杂度为n^2,无了
那我们考虑是否可以优化以上的方法-----
很容易可以发现删去一个字符时,只会改变前一个和后一个字符的性质(改变他们是否满足要求),那么我们下一轮操作可以从前一个字符开始继续往下找
需要注意的是一定要从没被操作2删去的字符开始找,查找操作1的复杂度为O(n),操作二复杂度为O(n),因此总复杂度为O(n)
代码:
#include <cstdio>
int n,T,pre[200100],nxt[200100];
char a[200100];
bool vis[200100];
void init()
{
for(int i=1;i<=n;i++) vis[i]=0;
for(int i=1;i<=n;i++)
{
pre[i]=i-1;
nxt[i]=i+1;
}
return;
}
int main()
{
int ans,x,cnt,be,k;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n); cnt=n;
scanf(" %s",a+1);
ans=0; init(); x=2; a[0]=a[n+1]='z'; be=1;
while(cnt)
{
ans++;
while((vis[x]||x==be)&&x<=n) x=nxt[x];
while(x<=n) {if (a[pre[x]]==a[x]||a[nxt[x]]==a[x]) break; x=nxt[x];}
if (x<=n)
{
vis[x]=1; cnt--; nxt[pre[x]]=nxt[x]; pre[nxt[x]]=pre[x];
if (pre[x]>be) x=pre[x];
else x=nxt[x];
}
else {vis[be]=1; cnt--; pre[nxt[be]]=0; be=nxt[be];}
if (!cnt) break;
k=a[be];
while(a[be]==k&&be<=n) {vis[be]=1; cnt--; pre[nxt[be]]=0; be=nxt[be];}
}
printf("%d\n",ans);
}
return 0;
}
(写得丑勿喷
CF1430 D. String Deletion(div 2)的更多相关文章
- CF1430 E. String Reversal(div 2)
题目链接:http://codeforces.com/contest/1430/problem/E 题意:有一串长度为n(n<=2*10^5)由小写字母组成的字符串,求通过相邻交换得到其反转串( ...
- ES6, Angular,React和ABAP中的String Template(字符串模板)
String Template(字符串模板)在很多编程语言和框架中都支持,是一个很有用的特性.本文将Jerry工作中使用到的String Template的特性做一个总结. ES6 阮一峰老师有一个专 ...
- Codeforces Round #581(Div. 2)
Codeforces Round #581(Div. 2) CF 1204 A. BowWow and the Timetable 题解:发现,$4$的幂次的二进制就是一个$1$后面跟偶数个$0$. ...
- 1050 String Subtraction (20 分)
1050 String Subtraction (20 分) Given two strings S1 and S2, S=S1−S2 is defined to be the ...
- pat 1050 String Subtraction(20 分)
1050 String Subtraction(20 分) Given two strings S1 and S2, S=S1−S2 is defined to be the ...
- 10-2 body标签中相关的标签(字体标签,排版标签(div,span),超链接,图片标签)
一 排版标签(div,span) 1块级标签 <!--div:把标签中的内容作为一个块儿来对待(division).必须单独占据一行.--> <!--div标签的属性:--> ...
- Codeforces Round #617 (Div. 3) String Coloring(E1.E2)
(easy version): 题目链接:http://codeforces.com/contest/1296/problem/E1 题目一句话就是说,两种颜色不同的字符可以相互换位, 问,对这字符串 ...
- 网站常见问题及解决方法(div/css)
18.<a> 在IE6,7 下面重新定义宽和高的代码:{ display:block; display:-moz-inline-stack; display:inline-block; ...
- LeetCode算法题-Reverse String II(Java实现)
这是悦乐书的第256次更新,第269篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第123题(顺位题号是541).给定一个字符串和一个整数k,你需要反转从字符串开头算起的 ...
随机推荐
- P4742 【[Wind Festival]Running In The Sky】
相信来做这道题的人肯定都学过\(Tarjan\)缩点吧,如果没有建议先去做P3387 [模板]缩点,如果你忘了,建议也去看看 满足上面要求后,你会惊奇发现,这两道题基本一样,唯一的差别就是这道题需要记 ...
- [HarekazeCTF2019]Avatar Uploader 1 &&
[HarekazeCTF2019]Avatar Uploader 1 这是一个文件上传的题目,但是这导体是通过满足条件来获取flag的. 他有两个函数,一个是getimagesize,还有一个是FIL ...
- Dubbo 成熟度策略.
url: http://dubbo.apache.org/zh-cn/docs/user/maturity.html Dubbo成熟度策略 Feature Maturity Strength Prob ...
- java.lang.illegalArgumentException异常
今天在使用spring3.2的时候,配置好注解开发后,运行出现异常 java.lang.illegalArgumentException 经查为 JRE 版本域spring3.2不兼容所致, 将项目J ...
- 中秋国庆8天挑战赛 之 挑战8天掌握微信小程序
中秋国庆8天挑战赛 挑战8天掌握微信小程序 当前学习进度: // 10.1// 学习内容:// 10.2// 学习内容:// 10.3// 学习内容:// 10.4// 学习内容:// ...
- (leetcode每日打卡)秋叶收藏集【动态规划】
LCP 19.秋叶收藏集 题目链接 算法 动态规划 时间复杂度O(n) 1.题目要求最终形成[红.黄.红]三部分,每部分数量可以不相等,问最终调整操作数量最小是多少.这道题一开始考虑暴力去做,枚举两个 ...
- 004 01 Android 零基础入门 01 Java基础语法 01 Java初识 04 Java程序的结构
004 01 Android 零基础入门 01 Java基础语法 01 Java初识 04 Java程序的结构 Java程序的结构 Java程序外层--类 程序外层,如下面的代码,是一个类的定义. c ...
- 固件(Firmware)
来源:https://baike.baidu.com/item/%E5%9B%BA%E4%BB%B6/627829 固件 固件(Firmware)就是写入EPROM(可擦写可编程只读存储器)或EE ...
- unsigned int 和 int
就如同int a:一样,int 也能被其它的修饰符修饰.除void类型外,基本数据类型之前都可以加各种类型修饰符,类型修饰符有如下四种:1.signed----有符号,可修饰char.int.Int是 ...
- iOS使用NSTextAttachment添加图片,图片模糊
最近在忙的项目中,需要处理富文本的相关内容,产品需求并不复杂,所以想着用TextKit处理,顺便学习一下,没想到直接掉坑.在此记录一下(都是血泪史),顺便为有需要的小伙伴提供参考. // Add th ...