热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

(线段树字符串的处理)codeforces570C

链接:http:acm.hust.edu.cnvjudgecontestview.action?cid87813#problemJDescriptionDanielh

链接:

http://acm.hust.edu.cn/vjudge/contest/view.action?cid=87813#problem/J

 

Description

Daniel has a string s, consisting of lowercase English letters and period signs (characters '.'). Let's define the operation of replacement as the following sequence of steps: find a substring ".." (two consecutive periods) in string s, of all occurrences of the substring let's choose the first one, and replace this substring with string ".". In other words, during the replacement operation, the first two consecutive periods are replaced by one. If string s contains no two consecutive periods, then nothing happens.

Let's define f(s) as the minimum number of operations of replacement to perform, so that the string does not have any two consecutive periods left.

You need to process m queries, the i-th results in that the character at position xi (1 ≤ xi ≤ n) of string s is assigned value ci. After each operation you have to calculate and output the value of f(s).

Help Daniel to process all queries.

Input

The first line contains two integers n and m (1 ≤ n, m ≤ 300 000) the length of the string and the number of queries.

The second line contains string s, consisting of n lowercase English letters and period signs.

The following m lines contain the descriptions of queries. The i-th line contains integer xi and ci (1 ≤ xi ≤ nci — a lowercas English letter or a period sign), describing the query of assigning symbol ci to position xi.

Output

Print m numbers, one per line, the i-th of these numbers must be equal to the value of f(s) after performing the i-th assignment.

Sample Input

Input

10 3
.b..bz....
1 h
3 c
9 f

Output

4
3
1

Input

4 4
.cc.
2 .
3 .
2 a
1 a

Output

1
3
1
1

Hint

Note to the first sample test (replaced periods are enclosed in square brackets).

The original string is ".b..bz....".

  • after the first query f(hb..bz....) = 4    ("hb[..]bz...."  →  "hb.bz[..].."  →  "hb.bz[..]."  →  "hb.bz[..]"  →  "hb.bz.")
  • after the second query f(hbс.bz....) = 3    ("hbс.bz[..].."  →  "hbс.bz[..]."  →  "hbс.bz[..]"  →  "hbс.bz.")
  • after the third query f(hbс.bz..f.) = 1    ("hbс.bz[..]f."  →  "hbс.bz.f.")

Note to the second sample test.

The original string is ".cc.".

  • after the first query: f(..c.) = 1    ("[..]c."  →  ".c.")
  • after the second query: f(....) = 3    ("[..].."  →  "[..]."  →  "[..]"  →  ".")
  • after the third query: f(.a..) = 1    (".a[..]"  →  ".a.")
  • after the fourth query: f(aa..) = 1    ("aa[..]"  →  "aa.")

找到了规律很水的AC了,但看了题解后知道原来这是个线段树, 两个代码都粘一下

 

水的代码:

#include
#include
<string.h>#define N 301100char s[N];int main()
{
int n, m, sum, z;while(scanf("%d%d", &n, &m)!&#61;EOF){char ch;int k, i;scanf("%s", s);sum&#61;0;for(i&#61;0; i){z &#61; 0;while(s[i]&#61;&#61;&#39;.&#39; && i<n){z&#43;&#43;;i&#43;&#43;;}if(z)sum&#43;&#61;z-1;}for(i&#61;1; i<&#61;m; i&#43;&#43;){scanf("%d %c", &k, &ch);if((s[k-1]!&#61;&#39;.&#39;&&ch!&#61;&#39;.&#39;) || (s[k-1]&#61;&#61;&#39;.&#39;&&ch&#61;&#61;&#39;.&#39;) ){printf("%d\n", sum);continue;}if(ch&#61;&#61;&#39;.&#39; && s[k-1]!&#61;&#39;.&#39;){if(s[k]!&#61;&#39;.&#39; && s[k-2]!&#61;&#39;.&#39;)sum &#61; sum;else if(s[k]&#61;&#61;&#39;.&#39; && s[k-2]&#61;&#61;&#39;.&#39;)sum &#43;&#61; 2;else if(s[k]&#61;&#61;&#39;.&#39; || s[k-2]&#61;&#61;&#39;.&#39;)sum &#43;&#61; 1;}if(ch!&#61;&#39;.&#39; && s[k-1]&#61;&#61;&#39;.&#39;){if(s[k]&#61;&#61;&#39;.&#39; && s[k-2]&#61;&#61;&#39;.&#39;)sum &#61; sum-2;else if(s[k]!&#61;&#39;.&#39; && s[k-2]!&#61;&#39;.&#39;)sum &#61; sum;else if(s[k]!&#61;&#39;.&#39; || s[k-2]!&#61;&#39;.&#39;)sum &#61; sum-1;}s[k-1] &#61; ch;printf("%d\n", sum);}}return 0;
}

 

 

 

线段树&#xff1a;

/*************************************************************************> File Name: C.cpp> Author: ALex> Mail: zchao1995&#64;gmail.com > Created Time: 2015年08月14日 星期五 01时09分43秒************************************************************************/#include
#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include
<set>
#include

#include

#include

#include
<string>
#include

#include

#include

#include

#include
using namespace std;const double pi &#61; acos(-1.0);
const int inf &#61; 0x3f3f3f3f;
const double eps &#61; 1e-15;
typedef
long long LL;
typedef unsigned
long long ULL;
typedef pair
<int, int> PLL;
const LL INF &#61; (1LL <<60);const int N &#61; 300010;
struct SegTree {int l, r;int lenl, lenr;int len;int cnt;
}tree[N
<<2];
char str[N];void pushup(int p){tree[p].lenl &#61; tree[p <<1].lenl;if (tree[p].lenl &#61;&#61; tree[p <<1].r - tree[p <<1].l &#43; 1) {tree[p].lenl &#43;&#61; tree[p <<1 | 1].lenl;}tree[p].lenr &#61; tree[p <<1 | 1].lenr;if (tree[p].lenr &#61;&#61; tree[p <<1 | 1].r - tree[p <<1 | 1].l &#43; 1) {tree[p].lenr &#43;&#61; tree[p <<1].lenr;}tree[p].cnt &#61; tree[p <<1].cnt &#43; tree[p <<1 | 1].cnt;if (tree[p <<1].lenr && tree[p <<1 | 1].lenl){--tree[p].cnt;}tree[p].len &#61; tree[p <<1].len &#43; tree[p <<1 | 1].len;
}
void build(int p, int l, int r)
{tree[p].l
&#61; l;tree[p].r &#61; r;if (l &#61;&#61; r) {tree[p].cnt &#61; tree[p].lenl &#61; tree[p].lenr &#61; tree[p].len &#61; (str[l - 1] &#61;&#61; &#39;.&#39;);return;}int mid &#61; (l &#43; r) >> 1;build(p <<1, l, mid);build(p <<1 | 1, mid &#43; 1, r);pushup(p);
}
void update(int p, int pos)
{
if (tree[p].l &#61;&#61; tree[p].r) {tree[p].cnt &#61; tree[p].lenl &#61; tree[p].lenr &#61; tree[p].len &#61; (str[tree[p].l - 1] &#61;&#61; &#39;.&#39;);return;}int mid &#61; (tree[p].l &#43; tree[p].r) >> 1;if (pos <&#61; mid) {update(p <<1, pos);}else {update(p <<1 | 1, pos);}pushup(p);
}
char v[4];
int main()
{
int n, m;scanf("%d%d", &n, &m);scanf("%s", str);build(1, 1, n);int x;while (m--){scanf("%d%s", &x, v);str[x - 1] &#61; v[0];update(1, x);printf("%d\n", tree[1].len - tree[1].cnt);}return 0;
}

 

 


转:https://www.cnblogs.com/YY56/p/4731853.html



推荐阅读
  • 探讨ChatGPT在法律和版权方面的潜在风险及影响,分析其作为内容创造工具的合法性和合规性。 ... [详细]
  • 深入解析SpringMVC核心组件:DispatcherServlet的工作原理
    本文详细探讨了SpringMVC的核心组件——DispatcherServlet的运作机制,旨在帮助有一定Java和Spring基础的开发人员理解HTTP请求是如何被映射到Controller并执行的。文章将解答以下问题:1. HTTP请求如何映射到Controller;2. Controller是如何被执行的。 ... [详细]
  • 在高并发需求的C++项目中,我们最初选择了JsonCpp进行JSON解析和序列化。然而,在处理大数据量时,JsonCpp频繁抛出异常,尤其是在多线程环境下问题更为突出。通过分析发现,旧版本的JsonCpp存在多线程安全性和性能瓶颈。经过评估,我们最终选择了RapidJSON作为替代方案,并实现了显著的性能提升。 ... [详细]
  • 并发编程 12—— 任务取消与关闭 之 shutdownNow 的局限性
    Java并发编程实践目录并发编程01——ThreadLocal并发编程02——ConcurrentHashMap并发编程03——阻塞队列和生产者-消费者模式并发编程04——闭锁Co ... [详细]
  • 优化SQL Server批量数据插入存储过程的实现
    本文介绍了一种改进的SQL Server存储过程,用于生成批量插入语句。该方法不仅提高了性能,还支持单行和多行模式,适用于SQL Server 2005及以上版本。 ... [详细]
  • 深入解析Spring启动过程
    本文详细介绍了Spring框架的启动流程,帮助开发者理解其内部机制。通过具体示例和代码片段,解释了Bean定义、工厂类、读取器以及条件评估等关键概念,使读者能够更全面地掌握Spring的初始化过程。 ... [详细]
  • Python + Pytest 接口自动化测试中 Token 关联登录的实现方法
    本文将深入探讨 Python 和 Pytest 在接口自动化测试中如何实现 Token 关联登录,内容详尽、逻辑清晰,旨在帮助读者掌握这一关键技能。 ... [详细]
  • 本文详细解释了为什么在成功执行移动赋值操作后,对象的析构函数会被调用,并提供了代码示例和详细的分析。 ... [详细]
  • 本文介绍了 Python 的 Pmagick 库中用于图像处理的木炭滤镜方法,探讨其功能和用法,并通过实例演示如何应用该方法。 ... [详细]
  • 由二叉树到贪心算法
    二叉树很重要树是数据结构中的重中之重,尤其以各类二叉树为学习的难点。单就面试而言,在 ... [详细]
  • 本文介绍了如何使用暴力方法解决HDU5444问题。代码通过逐个检查输入数据,确保在所有情况下都能找到正确的解决方案。 ... [详细]
  • 深入解析 Android IPC 中的 Messenger 机制
    本文详细介绍了 Android 中基于消息传递的进程间通信(IPC)机制——Messenger。通过实例和源码分析,帮助开发者更好地理解和使用这一高效的通信工具。 ... [详细]
  • 本文探讨了符号三角形问题,该问题涉及由相同数量的“+”和“-”符号组成的三角形。通过递归回溯法,可以有效地搜索并计算符合条件的符号三角形的数量。 ... [详细]
  • 深入解析Java多线程与并发库的应用:空中网实习生面试题详解
    本文详细探讨了Java多线程与并发库的高级应用,结合空中网在挑选实习生时的面试题目,深入分析了相关技术要点和实现细节。文章通过具体的代码示例展示了如何使用Semaphore和SynchronousQueue来管理线程同步和任务调度。 ... [详细]
  • 本文介绍了如何通过Java代码计算一个整数的位数,并展示了多个基础编程示例,包括求和、平均分计算、条件判断等。 ... [详细]
author-avatar
pingyuki
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有