树状数组 + 二分 - 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. 怎么在电脑上使用python-开始在 Windows 上使用 Python(初学者)
  2. wxWidgets:wxListView类用法
  3. html使用element ui_Kendo UI for jQuery使用教程:自定义小部件(二)
  4. vue 移动到图片浮动_基于Vue实现图片在指定区域内移动
  5. Spring MVC 之 请求url 带后缀的情况
  6. FIREDAC(DELPHI10 or 10.1)提交数据给ORACLE数据库的一个不是BUG的BUG
  7. IDEA代码行数统计工具使用——statistic插件
  8. 5款Java微服务开源框架
  9. VideoEdit+ User Manual
  10. [AE 表达式]路径跟随动画
  11. 理解openssl协议:x509、crt、cer、key、csr、ssl、tls 这些都是什么鬼? 如何给自己网站颁发证书?
  12. 疫情渐消,政策向好,车企的春天要回来了?
  13. Android蓝牙通信
  14. 高通linux-多核启动以及CPU热插拔驱动
  15. mpvue + vuex搭建小程序详细教程
  16. U盘图标更改个性化工具
  17. 常见的HTTP网络状态码汇总+HttpServletResponse源码
  18. Google图书馆现在开幕
  19. PS-InSAR大型机场变形监测
  20. ChatGPT超级智能体改写人类未来的宇宙大冒险!|小智ai

热门文章

  1. MySQL安装失败后如何纯净卸载删除
  2. HK-2000 数采仪系统说明之 3.数采应用程序目录说明
  3. android webview 多文件上传,Android网页WebView图片文件上传的问题
  4. 蓝湖怎么切图标注_蓝湖让APP设计师再也不用每天手动标注和切图了
  5. 一个低调的王者 - 谁是游戏类Dapp圈内最赚钱的团队?
  6. 【Pyrosim案例】01:空气流动
  7. pythonlicense问题_解决Pynlpir分词License过期问题
  8. 采用卷积神经网络实现斗地主AI
  9. python3 中怎么把类似这样的'\xe5\xae\x9d\xe9\xb8\xa1\xe5\xb8\x82'转换成汉字输出
  10. 【C】UThash使用笔记