树状数组 + 二分 - Query HDU - 4339

题意:

T组测试用例,每组给定两个长度分别为l1和l2的字符串s1,s2。有两种询问:①、1idic:将第id个字符串的第i个字符变成字符c。id为1或2,下标从0开始。②、2i,输出s1和s2从第i个字符串开始的最长公共前缀。T组测试用例,每组给定两个长度分别为l_1和l_2的字符串s_1,s_2。\\有两种询问:\\①、1\ id\ i\ c:将第id个字符串的第i个字符变成字符c。id为1或2,下标从0开始。\\②、2\ i,输出s_1和s_2从第i个字符串开始的最长公共前缀。T组测试用例,每组给定两个长度分别为l1​和l2​的字符串s1​,s2​。有两种询问:①、1 id i c:将第id个字符串的第i个字符变成字符c。id为1或2,下标从0开始。②、2 i,输出s1​和s2​从第i个字符串开始的最长公共前缀。

Sample Input:
1
aaabba
aabbaa
7
2 0
2 1
2 2
2 3
1 1 2 b
2 0
2 3Sample Output:
Case 1:
2
1
0
1
4
1

数据范围:
Q<=100000.l1,l2<=1000000.Timelimit:10000ms,Memorylimit:65536kBQ <= 100000.\\ l_1, l_2 <= 1000000.\\Time \ limit:10000 ms,Memory \ limit:65536 kBQ<=100000.l1​,l2​<=1000000.Time limit:10000ms,Memory limit:65536kB

题解:

树状数组维护一个字符串,只要第i位上的两个字符相等,就增加1,否则该位为0。询问①:若更改字符之前,s1[i]=s2[i],更改之后的二者不相等,那么树上对应的区间−1。反之,若更改之前二者不等,更改后二者相等,那么树上对应的区间+1。询问②:求区间和,二分枚举最大相同前缀的长度即可。树状数组维护一个字符串,只要第i位上的两个字符相等,就增加1,否则该位为0。\\\ \\询问①:若更改字符之前,s_1[i]=s_2[i],更改之后的二者不相等,那么树上对应的区间-1。\\\qquad\qquad反之,若更改之前二者不等,更改后二者相等,那么树上对应的区间+1。\\询问②:求区间和,二分枚举最大相同前缀的长度即可。树状数组维护一个字符串,只要第i位上的两个字符相等,就增加1,否则该位为0。 询问①:若更改字符之前,s1​[i]=s2​[i],更改之后的二者不相等,那么树上对应的区间−1。反之,若更改之前二者不等,更改后二者相等,那么树上对应的区间+1。询问②:求区间和,二分枚举最大相同前缀的长度即可。

总的时间复杂度O(nlog2n)。总的时间复杂度O(nlog^2n)。总的时间复杂度O(nlog2n)。

注意点:
①、输出还有个Case....②、进行询问①操作时,要真正改变字符串对应位置上的字符,不仅仅改变树上对应区间的值。因为后续再次进行询问①时是对新的数组进行比较。(这里被样例给局限住了,卡了一个小时...①、输出还有个Case....\\②、进行询问①操作时,要真正改变字符串对应位置上的字符,不仅仅改变树上对应区间的值。\\\qquad因为后续再次进行询问①时是对新的数组进行比较。\\\qquad(这里被样例给局限住了,卡了一个小时...①、输出还有个Case....②、进行询问①操作时,要真正改变字符串对应位置上的字符,不仅仅改变树上对应区间的值。因为后续再次进行询问①时是对新的数组进行比较。(这里被样例给局限住了,卡了一个小时...


代码:

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>using namespace std;const int N=1e6+10;int T,q,n,m,tr[N*2];
char s1[N*2],s2[N*2];int lowbit(int x)
{return x&-x;
}void add(int x,int c)
{for(int i=x;i<=n;i+=lowbit(i)) tr[i]+=c;
}int sum(int x)
{int res=0;for(int i=x;i;i-=lowbit(i)) res+=tr[i];return res;
}int main()
{scanf("%d",&T);for(int k=1;k<=T;k++){printf("Case %d:\n",k);memset(tr,0,sizeof tr);scanf("%s%s",s1+1,s2+1);n=strlen(s1+1),m=strlen(s2+1);for(int i=1;i<=min(n,m);i++)if(s1[i]==s2[i]) add(i,1);scanf("%d",&q);while(q--){int op,pos,id;char c[2];scanf("%d",&op);if(op==2){scanf("%d",&pos);pos++;int l=0,r=min(n,m)-pos+1;while(l<r){int mid=l+r+1>>1;if(sum(pos+mid-1)-sum(pos-1)==mid) l=mid;else r=mid-1;}printf("%d\n",l);}else{scanf("%d%d%s",&id,&pos,c);pos++;if(id==1){if(s1[pos]!=s2[pos]&&*c==s2[pos]) add(pos,1);else if(s1[pos]==s2[pos]&&*c!=s2[pos]) add(pos,-1);s1[pos]=*c;}else{if(s1[pos]!=s2[pos]&&*c==s1[pos]) add(pos,1);else if(s1[pos]==s2[pos]&&*c!=s1[pos]) add(pos,-1);s2[pos]=*c;}}}}return 0;
}

树状数组 + 二分 - Query HDU - 4339相关推荐

  1. VK Cup 2012 Qualification Round 2 C. String Manipulation 1.0 线段树 or 树状数组+二分

    http://codeforces.com/problemset/problem/159/C 题意: 给你一个字符串s,给出一个数k,k倍的s串组成新串str.然后给出n个操作,每个操作对应着pi,c ...

  2. P2161 [SHOI2009]会场预约[线段树/树状数组+二分/STL]

    题目描述 PP大厦有一间空的礼堂,可以为企业或者单位提供会议场地.这些会议中的大多数都需要连续几天的时间(个别的可能只需要一天),不过场地只有一个,所以不同的会议的时间申请不能够冲突.也就是说,前一个 ...

  3. POJ2828 Buy Tickeys 树状数组+二分 线段树留坑。。。

    题意:一堆人排队买票,告诉你一堆人的序号(序号的意思是插在"当前"第几个人的后面)和姓名(姓名用编号代替). 思路:线段树 或 树状数组+二分(自己还不会线段树,所以这里继续留坑) ...

  4. hdu(4339)树状数组+二分查找

    /* s1[i]与s2[i]匹配,树状数组i位置更新1,否则更新0.*/#include<stdio.h> #include<string.h> #include<alg ...

  5. [HDU - 2852] KiKi's K-Number (树状数组+二分)

    链接 http://acm.hdu.edu.cn/showproblem.php?pid=2852 题意 现在需要你对一个空序列做nnn次操作,操作分三种 0x0\ \ x0  x :向序列中加入一个 ...

  6. HDU 2852 KiKi's K-Number (树状数组+二分)

    题意: 给出一些操作: 0 x 在数组中加入一个数x 1 x 在数组中去掉一个数x 2 a k 在数组中查询比a大的第k小数 分析: 首先看到题目的数据范围 e<100000 ,发现数组完全可以 ...

  7. hdu4339 Query (字符串公共长度,树状数组+二分)

    题意: 给两个字符串s1,s2(长度可能不同) 和m次操作 操作有两种: (1 a i c)表示把第a个字符串的第i个字符改成字符c (其中a为1或者2) (2 i)输出最大的j,满足两个字符串在区间 ...

  8. 最长上升子序列(LIS)/最长不上升子序列问题算法详解+例题(树状数组/二分优化,看不懂你来打我)

    目录 最长上升子序列 一.朴素做法O(2n)O(2^n)O(2n) 二.优化做法O(nlogn)O(nlogn)O(nlogn) 三.例题引入:P1020 导弹拦截(求最长上升子序列和最长不上升子序列 ...

  9. CF1404C:Fixed Point Removal(离线)(树状数组二分)

    解析 写了不少线段树上二分,原来树状数组上也是可以二分的 首先如果ai>ia_i>iai​>i,那必然无法删除,下面只考虑ai<=ia_i<=iai​<=i的情况 ...

最新文章

  1. java中如果写设置密码,在java中编写一个多字母换位密码[关闭]
  2. VS2010 SQL Server 2005 Database Project 使用笔记(二)
  3. 化解三大错误晚餐方式。
  4. 列宽一字符等于多少厘米_字符串匹配算法总结——BF、KMP、BM
  5. JSP动态网站环境搭建应用中的详细步骤(Tomcat和Apache/IIS的整合)
  6. 互动留言赠书:《Oracle高性能系统实战大全》
  7. 对话框控件访问七种方式
  8. 服务器怎么操作系统版本,服务器怎么操作系统版本
  9. php公众获取用户信息,PHP--通过公众号获取用户微信信息
  10. 九天学会Java,第三天,选择结构
  11. 游戏开发工具,让你事半功倍!
  12. PLC可编程控制器实验
  13. 洛谷题解:P1007 独木桥
  14. 如何用Python写一个安卓APP
  15. D2RQ平台之本体操作
  16. JAVA使用jcifs读取共享文件夹(SMB1,SMB2协议)
  17. 记录_20190626
  18. python使用 tkinter + you-get 实现视频下载器以及 pyinstaller 打包时的问题
  19. 记录贴:RuntimeError: version_ <= kMaxSupportedFileFormatVersion INTERNAL ASSERT FAILED at /pytorch/caff
  20. 新闻!牛磨王抗磨网发布超燃猪年贺岁词 | “绿多多”绿色资产资讯

热门文章

  1. 亲测有效|处理风控数据特征缺失的一种方法
  2. 限时下载 | 福建省区块链协会官方材料《区块链落地案例选集》
  3. 勾选框秘密(radio checkbox)
  4. Openlab实验平台实验--Mininet 常用命令
  5. socket 测试工具_Soloπ:支付宝开源的Android专项测试工具
  6. 加注超融合 星辰天合推出 XHERE V2 系列
  7. VMware Workstation and Device/Credential Guard are not compatible“ error in VMware Workstation win10
  8. java opencv实现扫描图像去底色增强文字
  9. 最新OmniPeek无线驱动详细列表与下载说明/支持捉空口包的网卡
  10. ThinkPad X220安装Centos问题记录