zoukankan      html  css  js  c++  java
  • hdu 4339 Query

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4339

    题意:给出两个字符串S1,S2,进行两种操作:

    (1)1 a i c  在字符串Sa中,将Sa[i]变成c

    (2)2 i,求从i下标开始的最长匹配长度。

    View Code
      1 #include <stdio.h>
      2 #include <string.h>
      3 #define lson l,m,rt<<1
      4 #define rson m+1,r,rt<<1|1
      5 #define maxn 1000001
      6 struct node
      7 {
      8     int pos;
      9 }setree[maxn<<2];
     10 char s1[maxn],s2[maxn];
     11 int max(int a,int b)
     12 {
     13     return a>b?a:b;
     14 }
     15 int min(int a,int b)
     16 {
     17     return a<b?a:b;
     18 }
     19 void pushup(int rt,int len,int l)
     20 {
     21     if(len-len/2==setree[rt<<1].pos-l+1&&setree[rt<<1|1].pos!=-1)
     22     setree[rt].pos=setree[rt<<1|1].pos;
     23     else
     24     setree[rt].pos=setree[rt<<1].pos;
     25 }
     26 void build(int l,int r,int rt)
     27 {
     28     if(l==r){
     29         if(s1[l]==s2[l])
     30         setree[rt].pos=l;
     31         else
     32         setree[rt].pos=-1;
     33         return ;
     34     }
     35     int m=(l+r)>>1;
     36     build(lson);
     37     build(rson);
     38     pushup(rt,r-l+1,l);
     39 }
     40 void update(int l,int r,int rt,int num)
     41 {
     42     if(l==r){
     43         if(s1[l]==s2[l])
     44         setree[rt].pos=l;
     45         else
     46         setree[rt].pos=-1;
     47         return ;
     48     }
     49     int m=(l+r)>>1;
     50     if(num<=m)
     51     update(lson,num);
     52     else
     53     update(rson,num);
     54     pushup(rt,r-l+1,l);
     55 }
     56 int query(int l,int r,int rt,int L,int R)
     57 {
     58     if(L<=l&&r<=R)
     59     return setree[rt].pos;
     60     int m=(l+r)>>1;
     61     int ans1=-2,ans2=-2;
     62     if(L<=m)
     63     ans1=query(lson,L,R);
     64     if(R>m)
     65     ans2=query(rson,L,R);
     66     if(ans1==m)
     67     return max(ans1,ans2);
     68     else if(ans1!=-2)
     69     return ans1;
     70     else
     71     return ans2;
     72     
     73 }
     74 int main()
     75 {
     76     int t,cas=1;
     77     scanf("%d",&t);
     78     while(t--){
     79         scanf("%s%s",s1,s2);
     80         int n=min(strlen(s1),strlen(s2)),m;
     81         build(0,n-1,1);
     82         scanf("%d",&m);
     83         printf("Case %d:\n",cas++);
     84         while(m--){
     85             int op;
     86             scanf("%d",&op);
     87             if(op==1){
     88                 int a,b;
     89                 char c[5];
     90                 scanf("%d%d%s",&a,&b,c);
     91                 if(a==1)
     92                 s1[b]=c[0];
     93                 else
     94                 s2[b]=c[0];
     95                 update(0,n-1,1,b);
     96             }
     97             else{
     98                 int a;
     99                 scanf("%d",&a);
    100                 int temp=query(0,n-1,1,a,n-1);
    101                 if(temp==-1)
    102                 printf("0\n");
    103                 else
    104                 printf("%d\n",temp-a+1);
    105             }
    106         }
    107     }
    108     return 0;
    109 }
  • 相关阅读:
    Linux配置YUM源(2020最新最详细)
    Linux系统安装Tomcat9(2020最新最详细)
    Linux系统安装JDK1.8(2020最新最详细)
    框架集项目-登录账户过期,如何回到登录主页!
    C# 以管理员方式运行程序
    C#/STM32 WAV转byte WAV数据格式
    C# base64 转 byte[]
    C# 截取屏幕图像
    emWin 学习笔记 —— 用VS2017打开emWin仿真包
    STM32 时钟配置的坑
  • 原文地址:https://www.cnblogs.com/kim888168/p/2843484.html
Copyright © 2011-2022 走看看