题意:给定一个字符串,里面有各种小写字母和’ . ' ,无论是什么字母,都是一样的,假设遇到' . . ' ,就要合并成一个' .',有m个询问,每次都在字符串某个位置上将原来的字符改成题目给的字符,问每次须要多少次合并次数。才使字符串没有‘ .. '

思路:最原始的想法,就是对于每一次询问,都遍历整个字符串。这样时间复杂度o(n*m),就高达10^10方,非常明显会tle。

换下思路,事实上每次询问所改变的字符都会保留到下一次。也就是下一次的次数就会受到上一次的影响,那么我仅仅要就算出第一次的合并次数,以下的都能够推出来

题目链接:http://codeforces.com/problemset/problem/570/C

#include<bits/stdc++.h>
using namespace std;
int n,m,cnt;
char a[300005],b[10];
int main(void)
{
scanf("%d%d",&n,&m);
scanf("%s",a+1);
scanf("%d%s",&cnt,b);
a[cnt]=b[0];//处理第一次
int ret,ans=0,flag;
for(int i=1; i<=n; i++)
{
ret=0;
flag=0;
while(a[i]=='.')//假设一个子序列全都是'.',假设有ret个'.',那么合并次数就是ret-1;
{
i++;
ret++;
flag=1;
}
if(flag) ans+=ret-1;
}
printf("%d\n",ans);
for(int i=1; i<m; i++)//处理剩余的m-1次,每一次的ans均由上一次推出
{ scanf("%d%s",&cnt,b);
char ch=a[cnt];
a[cnt]=b[0];
if(b[0]=='.'&&ch!='.')//假设这一次由字母变成'.',检查前后是否有'.',有一个的话合并次数就要+1
{
if(a[cnt-1]=='.') ans++;
if(a[cnt+1]=='.') ans++;
}
else if(b[0]!='.'&&ch=='.')//由字母变成'.'
{
if(a[cnt-1]=='.') ans--;
if(a[cnt+1]=='.') ans--;
}
printf("%d\n",ans);
}
return 0;
}

最新文章

  1. swift 单独部署,开发
  2. [转] Android 4.4中播放HTML5视频&lt;video&gt;的Bug
  3. DOM何时Ready
  4. AC 自动机
  5. JavaScript格式化时间
  6. MVC concept
  7. Android广播错误.MainActivity$MyReceiver; no empty constructor
  8. [ACM] poj 1064 Cable master (二分查找)
  9. int 与 Integer--话说数组转集合
  10. Entity SQL 初入
  11. centOS 6.4 vsftpd 安装配置
  12. 使用XStream注解实现Java对象与XML互相转换的代码示例
  13. Java引用类型具体解释
  14. SVG图像技术摘要
  15. 完美分割字符串,实现字符串的splict功能
  16. k-均值聚类算法1
  17. 痞子衡嵌入式:飞思卡尔Kinetis系列MCU启动那些事(11)- KBOOT特性(ROM API)
  18. Elasticsearch 安全篇
  19. js计算本地时间
  20. centos关闭邮件提醒

热门文章

  1. mybatis-spring_缓存
  2. C++11程序设计要点总结-模板机制详解
  3. 连接远程docker内的mysql(navicat)
  4. mysql语句中判断是否包含某字符串的方法
  5. rspec测试(使用guard自动测试和spork加速测试)配置
  6. Django框架基础知识09-请求与响应
  7. Django框架基础知识02-路由及渲染
  8. NYOJ-676小明的求助,快速幂求模,快速幂核心代码;
  9. hdu 3879 最大密集子图(点和边均带权)(模板)
  10. COdevs 1251 括号