题意是给你两个字符串    进行两种操作   1: 修改其中一个字符串里的某个字符2:   询问从i起两个字符串最多由多少个是相同的;

先说一下做之前的想法   ,我是看别人介绍树状数组是看到这道题的    本也想用树状数组做  ,没想上去    然后就改为线段树了   ,有很明显的点更新,区间查询,所以选择线段树;

思路:  每个节点num【】 存3个值       p1  p2  flash   flash表示当前节点两个字符串是不是一样的   若是则为1否则为0    p1 p2为当前两个字符串的字符(其实只有在最底端的节点  p1  p2才有意义)  题目给的是字符区间  而真正修改的是点    所以得先处理字符串加到线段树里也就是deal函数  (偷懒写在一个函数里果断超时了!!!)    然后对点来更新

对于查询 我是用的二分      开始j=最大长度     然后二分到底   虽然时间可能长点   但代码比较简单

#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;#define LL(x) (x<<1)
#define RR(x) ((x<<1)|1)

char str1[1000010],str2[1000010];
struct node
{char p1,p2;int flash;
}num[4*1000000];
int max(int a,int b)
{return a>b?a:b;
}
int deal(int L,int R,int left,int right,int mark,int k,char str[])
{    if(L==left&&right==R&&L==R){if(k==1) num[mark].p1=str[L-1];else num[mark].p2=str[L-1];if(num[mark].p1==num[mark].p2) num[mark].flash=1;else num[mark].flash=0;return 0;}int mid=(L+R)/2;if(right<=mid){deal(L,mid,left,right,LL(mark),k,str);}    else if(left>mid){deal(mid+1,R,left,right,RR(mark),k,str);}else{deal(L,mid,left,mid,LL(mark),k,str);deal(mid+1,R,mid+1,right,RR(mark),k,str);}if(num[LL(mark)].flash==0||num[RR(mark)].flash==0) num[mark].flash=0;else num[mark].flash=1;return 0;
}
int update(int L,int R,int dis,int mark,int k,char p)
{if(L==R&&L==dis){if(k==1) num[mark].p1=p;else num[mark].p2=p;if(num[mark].p1==num[mark].p2) num[mark].flash=1;else num[mark].flash=0;return 0;}if(num[mark].flash==1){num[LL(mark)].flash=num[RR(mark)].flash=num[mark].flash;}int mid=(L+R)/2;if(dis<=mid){update(L,mid,dis,LL(mark),k,p);}    else update(mid+1,R,dis,RR(mark),k,p);if(num[LL(mark)].flash==0||num[RR(mark)].flash==0){num[mark].flash=0;}else  num[mark].flash=1; return 0;
}
int find(int L,int R ,int left,int right,int mark)
{if(num[mark].flash==1) return 1;if(left==L&&right==R) return -1;int mid=(L+R)/2;if(right<=mid){return find(L,mid,left,right,LL(mark));}else if(left>mid){return find(mid+1,R,left,right,RR(mark));}else{int t1=find(L,mid,left,mid,LL(mark));int t2=find(mid+1,R,mid+1,right,RR(mark));if(t1==-1||t2==-1) return -1;else return 1;}
}
int main()
{int len1,len2,T,i,d=1;scanf("%d",&T);while(T--){  printf("Case %d:\n",d++);scanf("%s%s",str1,str2);len1=strlen(str1);len2=strlen(str2);int L=1,R=max(len1,len2);memset(num,0,sizeof(num));deal(L,R,1,len1,1,1,str1);deal(L,R,1,len2,1,2,str2);int Q;scanf("%d",&Q);while(Q--){int dis,x,k;char str[5];scanf("%d",&x);if(x==1){scanf("%d%d%s",&k,&dis,str);dis++;update(L,R,dis,1,k,str[0]);}else {int left;scanf("%d",&left);int t=left;left++;int right=R;while(left<=right){int mid=(left+right)/2;if(find(L,R,left,mid,1)==-1) right=mid-1;else left=mid+1;}printf("%d\n",left-t-1);}}    }return 0;
}

hdu 4339 线段树+二分相关推荐

  1. POJ 2777 ZOJ 1610 HDU 1698 --线段树--区间更新

    直接将这3题 放一起了  今天在做线段树的东西 这3个都是区间更新的 查询方式互相不同 反正都可以放到一起吧 直接先上链接了 touch me touch me touch me 关于涉及到区间的修改 ...

  2. 牛客小白月赛28 E-会当凌绝顶,一览众山小 线段树+二分暴力模拟

    牛客小白月赛28 E-会当凌绝顶,一览众山小 线段树+二分暴力模拟 题意 思路 Code 传送门: https://ac.nowcoder.com/acm/contest/16081/E 题意 登山顺 ...

  3. codeforces 609F Frogs and mosquitoes 线段树+二分+multiset

    http://codeforces.com/problemset/problem/609/F There are n frogs sitting on the coordinate axis Ox. ...

  4. HDU - 4614 Vases and Flowers 线段树+二分

    题目链接 思路:线段树维护区间和,当k=1时,询问二分询问[x-(x~n-1)]找到最小位置,复杂度n*logn*logn卡过 #include<stdio.h> #include< ...

  5. HDU - 6464 免费送气球(线段树二分)

    题意: 又到了GDUT一年一度的程序设计竞赛校赛的时间啦.同学们只要参加校赛,并且每解出一道题目就可以免费获得由ACM协会和集训队送出的气球一个.听到这个消息,JMC也想参加免费拿气球.可是,由于JM ...

  6. hdu4614 Vases and Flowers 线段树+二分

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4614 题意: 给你N个花瓶,编号是0  到 N - 1 ,初始状态花瓶是空的,每个花瓶最多插一朵花. ...

  7. 可持久化普通线段树 ---- P2839 [国家集训队]middle 可持久化普通线段树 + 二分 求中位数最大值

    题目链接 题目大意: 解题思路: 这个题思路很妙!! 首先我们假设只有一次询问怎么做? 那么我们可以二分出这个最大值midmidmid,然后把大于等于midmidmid设置成111,把小于midmid ...

  8. P1083 借教室(标记永久化线段树/二分+前缀和)难度⭐⭐⭐★

    P1083 借教室 标记永久化线段树 很典型的区间修改问题,先输入赋值建树(这就是最典型的线段树呀,别忘了),然后修改 这里问的是是否有足够的空教室,所以线段树中 min 代表的是当前区间内最小的剩余 ...

  9. hdu 4417(线段树OR树状数组)

    题意:输入一个长度为n的序列,然后m个询问,询问区间[a,b]中比h小的数的个数. 思路:树状数组或线段树离线处理. 树状数组1 View Code 1 #include<cstdio> ...

最新文章

  1. 关于Titandb Ratelimiter 失效问题的一个bugfix
  2. Hibernate 笔记1
  3. 提示You don't have permission to access /index.php on this server.
  4. vue指令:v-once 元素和组件只渲染一次,不会随着数据的改变而改变
  5. 用canvas绘制一个圆形,实现绕着一个中心运动
  6. jzoj2679-跨时代【背包,dfs,状压】
  7. 在BingoCC上面解析域名实现智能路由
  8. Java String简单知识点总结
  9. oracle统计每个类别,Oracle统计分析函数集之一
  10. ES6学习笔记四(数组)
  11. 20200122每日一句
  12. Vulkan::0.0::开始于VulKanSDK(Getting Started with the Vulkan SDK)
  13. 【OpenCV入门教程之二】 一览众山小:OpenCV 2.4.8 or OpenCV 2.4.9组件结构全解析
  14. 动态加密?看我如何见招拆招爬取某点评全站内容!
  15. CDR安装包下载+汉化简体中文版+安装教程
  16. scala的交互式图表工具wisp
  17. 环保物联网技术应用研究综述
  18. SAP软件系统合规性审计介绍
  19. Python基础——修改Python字典中的key(键)
  20. es filter中使用should

热门文章

  1. 域服务器禁止复制文件,ad域可以禁止拷贝数据库
  2. java可以操作扫描仪吗_在Java中操作扫描仪(使用JNI)
  3. 02-mysql多表查询
  4. 【复旦微(Procise安装篇)】
  5. html网页中的锚点(命名锚记)的使用介绍
  6. java大数据分析技术栈,字节跳动算法工程师面试总
  7. 为什么一些创立才2、3年的创新公司,不赚钱却可以赴美上市?
  8. FJUT ACM 2592 查询队列
  9. 一名程序员的自我评价
  10. “回溯”算法总结(深度优先遍历 + 状态重置 + 剪枝)