题目链接: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)的更多相关文章

  1. CF1430 E. String Reversal(div 2)

    题目链接:http://codeforces.com/contest/1430/problem/E 题意:有一串长度为n(n<=2*10^5)由小写字母组成的字符串,求通过相邻交换得到其反转串( ...

  2. ES6, Angular,React和ABAP中的String Template(字符串模板)

    String Template(字符串模板)在很多编程语言和框架中都支持,是一个很有用的特性.本文将Jerry工作中使用到的String Template的特性做一个总结. ES6 阮一峰老师有一个专 ...

  3. Codeforces Round #581(Div. 2)

    Codeforces Round #581(Div. 2) CF 1204 A. BowWow and the Timetable 题解:发现,$4$的幂次的二进制就是一个$1$后面跟偶数个$0$. ...

  4. 1050 String Subtraction (20 分)

    1050 String Subtraction (20 分) Given two strings S​1​​ and S​2​​, S=S​1​​−S​2​​ is defined to be the ...

  5. pat 1050 String Subtraction(20 分)

    1050 String Subtraction(20 分) Given two strings S​1​​ and S​2​​, S=S​1​​−S​2​​ is defined to be the ...

  6. 10-2 body标签中相关的标签(字体标签,排版标签(div,span),超链接,图片标签)

    一 排版标签(div,span) 1块级标签 <!--div:把标签中的内容作为一个块儿来对待(division).必须单独占据一行.--> <!--div标签的属性:--> ...

  7. Codeforces Round #617 (Div. 3) String Coloring(E1.E2)

    (easy version): 题目链接:http://codeforces.com/contest/1296/problem/E1 题目一句话就是说,两种颜色不同的字符可以相互换位, 问,对这字符串 ...

  8. 网站常见问题及解决方法(div/css)

    18.<a> 在IE6,7 下面重新定义宽和高的代码:{  display:block; display:-moz-inline-stack; display:inline-block;  ...

  9. LeetCode算法题-Reverse String II(Java实现)

    这是悦乐书的第256次更新,第269篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第123题(顺位题号是541).给定一个字符串和一个整数k,你需要反转从字符串开头算起的 ...

随机推荐

  1. 定时任务与feign超时的纠葛,该咋优化?

    1 背景 业务定时器应用半夜经常会触发熔断异常的告警邮件 根据邮件提示的类找到归纳以下表格 编号 报错方法 接口所属应用 所属定时任务类 A VipTradeReportFeignService#ge ...

  2. 关于python中break与continue的区别

    在python中break和continue都有跳出循环体的作用,但是他们还是有一些区别的,具体区别如下: break:是直接跳出循环,跳出自己所处的整个循环体 continue:只是跳出本次循环,而 ...

  3. 栈帧的内部结构--局部变量表(Local Variables)

    每个栈帧中包含: 局部变量表(Local Variables) 操作数栈(Opreand Stack) 或表达式栈 动态链接 (Dynamic Linking) (或指向运行时常量的方法引用) 动态返 ...

  4. Spring学习(三)Spring AOP 简介

    一.简介 定义 aop就是面向切面编程,在数据库事务中切面编程被广泛使用. 在面向切面编程的思想里面,把功能分为核心业务功能,和周边功能. 核心业务:比如登陆,增加数据,删除数据都叫核心业务 周边功能 ...

  5. Shiro框架--将Shrio的session改成HTTPSession数据

    重写 FormAuthenticationFilter类 的 onLoginSuccess()方法即可 import javax.servlet.ServletRequest; import java ...

  6. Linux/(centos、unix等)的ssh双向免密登录原理和实现

    原理: 双向,顾名思义,双方互通,此处的意思是多台 linux 两两免密登录. 双向比单向多了些操作,单向只需把某一个linux的公钥发送给其他linux即可,而双向要实现集群中的每一台机器都保存其他 ...

  7. golang开发:channel使用

    channel主要是用于多个goroutine之间通信 channel语法 channel是引用类型,需要实用make来创建channel,如下 make(chan Type, [buffer]) c ...

  8. C#中WebBrowser获取页面标签class值

    由于class是JavaScript的保留关键字 所以在C#中使用GetAttribute("className")来获取hmtlElement的class值 而不是GetAttr ...

  9. 坐标下降(Coordinate descent)

    坐标下降法属于一种非梯度优化的方法,它在每步迭代中沿一个坐标的方向进行线性搜索(线性搜索是不需要求导数的),通过循环使用不同的坐标方法来达到目标函数的局部极小值.

  10. SpringBoot整合SpringDataJPA,今天没啥事情就看了一下springboot整合springdataJPA,实在是香啊,SQL语句都不用写了

    SpringBoot整合SpringDataJPA 1.JPA概念 JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映 ...