hdu4339 Query

Problem Description

You are given two strings s1[0..l1], s2[0..l2] and Q - number of queries.

Your task is to answer next queries:

1) 1 a i c - you should set i-th character in a-th string to c;

2) 2 i - you should output the greatest j such that for all k (i<=k and k<i+j) s1[k] equals s2[k].

Input

The first line contains T - number of test cases (T<=25).

Next T blocks contain each test.

The first line of test contains s1.

The second line of test contains s2.

The third line of test contains Q.

Next Q lines of test contain each query:

1) 1 a i c (a is 1 or 2, 0<=i, i<length of a-th string, ‘a‘<=c, c<=‘z‘)

2) 2 i (0<=i, i<l1, i<l2)

All characters in strings are from ‘a‘..‘z‘ (lowercase latin letters).

Q <= 100000.

l1, l2 <= 1000000.

Output

For each test output "Case t:" in a single line, where t is number of test (numbered from 1 to T).

Then for each query "2 i" output in single line one integer j.

Sample Input

1
aaabba
aabbaa
7
2 0
2 1
2 2
2 3
1 1 2 b
2 0
2 3

Sample Output

Case 1:
2
1
0
1
4
1

这题属于区间合并,维护线段的llen(线段从左端点开始向右的最长连续1的长度),rlen(线段从右端点开始向左的最长连续1的长度),tlen(线段中最长连续1的长度,记录这个主要是为了剪枝,减少时间)。一开始先初始化,两个字符串,相同的部分记为1,不同的记为0,注意两个字符串的长度可能不同。
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<vector>
#include<map>
#include<queue>
#include<stack>
#include<string>
#include<algorithm>
using namespace std;
#define maxn 1000100
char s1[maxn],s2[maxn];
int a[maxn],num;
struct node{
    int l,r,llen,rlen,tlen;
}b[4*maxn];

void pushup(int i)
{
    b[i].tlen=max(b[i*2].tlen,b[i*2+1].tlen);
    b[i].tlen=max(b[i].tlen,b[i*2].rlen+b[i*2+1].llen);

    b[i].llen=b[i*2].llen;b[i].rlen=b[i*2+1].rlen;
    if(b[i*2].llen==b[i*2].r-b[i*2].l+1)b[i].llen+=b[i*2+1].llen;
    if(b[i*2+1].rlen==b[i*2+1].r-b[i*2+1].l+1)b[i].rlen+=b[i*2].rlen;
}

void build(int l,int r,int i)
{
    int mid;
    b[i].l=l;b[i].r=r;
    if(l==r){
        b[i].tlen=b[i].llen=b[i].rlen=a[l];return;
    }
    mid=(l+r)/2;
    build(l,mid,i*2);
    build(mid+1,r,i*2+1);
    pushup(i);
}

void update(int id,int value,int i)
{
    int mid;
    if(b[i].l==b[i].r){
        b[i].tlen=b[i].llen=b[i].rlen=value;return;
    }
    mid=(b[i].l+b[i].r)/2;
    if(mid>=id)update(id,value,i*2);
    else update(id,value,i*2+1);
    pushup(i);
}

void question(int id,int i)
{
    int mid;
    if(b[i].l==b[i].r){
        num=1;return;
    }
    if(b[i].tlen==b[i].r-b[i].l+1){
        num=b[i].r-id+1;return;
    }
    mid=(b[i].l+b[i].r)/2;
    if(mid>=id){                //用4个剪枝试一试
        if(b[i*2].r-b[i*2].rlen+1<=id){
            num=b[i*2].r-id+1+b[i*2+1].llen;return;
        }
        else{
            question(id,i*2);
        }
    }
    else{
        if(b[i*2+1].l+b[i*2+1].llen-1>=id){
            num=b[i*2+1].l+b[i*2+1].llen-1-id+1;return;
        }
        else question(id,i*2+1);
    }
}

int main()
{
    int n,m,i,j,T,len1,len2,len,d,e,flag,c,num1=0;
    char f[10];
    scanf("%d",&T);
    while(T--)
    {
        num1++;
        printf("Case %d:\n",num1);
        scanf("%s%s",s1+1,s2+1);
        len1=strlen(s1+1);len2=strlen(s2+1);
        len=min(len1,len2);
        for(i=1;i<=len;i++){
            if(s1[i]==s2[i])a[i]=1;
            else a[i]=0;
        }
        build(1,len,1);
        scanf("%d",&m);
        for(i=1;i<=m;i++){
            scanf("%d",&c);
            if(c==1){
                scanf("%d%d%s",&d,&e,f);
                e++;
                if(e>len)continue;
                if(s1[e]==s2[e])flag=1;
                else flag=0;

                if(d==1)s1[e]=f[0];
                else s2[e]=f[0];
                if(s1[e]==s2[e] && flag==0)update(e,1,1);
                else if(s1[e]!=s2[e] && flag==1)update(e,0,1); //这里可以节省200ms
            }
            else if(c==2){
                scanf("%d",&d);
                d++;
                if(d>len || s1[d]!=s2[d]){
                    printf("0\n");continue;
                }
                num=0;
                question(d,1);
                printf("%d\n",num);
            }
        }
    }
}

时间: 2024-08-25 08:41:50

hdu4339 Query的相关文章

解决query查询输入geometry参数查询不到而通过where条件可以查到的问题

解决query查询输入geometry参数查询不到而通过where条件可以查到的问题 原因: 是因为geometry的坐标系和所要查询的图层不一样导致的(问题引起是由于底图中叠加了不同的坐标系的引起的) 问题描述: 我在公司做好的功能并且测好了,到现场出了问题,发现通过where语句查询时正常的,拉宽查询不正常.并且通过网页打开图层查询请求页面,手动输入代码中得到的geometry查询是可以查到数据的. 问题解决过程: 通过fiddler跟踪请求的http路径(因为arcgisAPI请求arcg

SPOJ375 Query on a tree

https://vjudge.net/problem/SPOJ-QTREE 题意: 一棵树,每条边有个权值 两种操作 一个修改每条边权值 一个询问两点之间这一条链的最大边权 点数<=10000 多组测试数据,case<=20 Example Input: 1 3 1 2 1 2 3 2 QUERY 1 2 CHANGE 1 3 QUERY 1 2 DONE Output: 1 3 #include<cstdio> #include<iostream> #include&

你用什么方法检查PHP脚本的执行效率(通常是脚本执行时间)和数据库SQL的效率(通常是数据库Query时间),并定位和分析脚本执行和数据库查询的瓶颈所在?

腾讯 PHP脚本的执行效率 1, 代码脚本里计时. 2, xdebug统计函数执行次数和具体时间进行分析.,最好使用工具winCacheGrind分析 3, 在线系统用strace跟踪相关进程的具体系统调用. 数据库SQL的效率 sql的explain(mysql),启用slow query log记录慢查询. 通常还要看数据库设计是否合理,需求是否合理等.

java.lang.IllegalArgumentException: Illegal character in query at index 261

在BaseFragment中使用了LoadingPage,而LoadingPage的联网加载使用的是AsyncHttpClient.一直报java.lang.IllegalArgumentException: Illegal character in query at index 261解析不成功,改成OkHttp解析即可. 网上有些方法,说先URLEncode再拼接,如果解决不了,换个联网请求方式,试一下.

Fulltext Index Study3:Query

在query 语句中,可以使用 contains predicate来调用Fulltext Index,实现比like速度更快的查询.使用contains能够进行term的extract匹配查询或term的前缀匹配查询,还能够进行基于词根的steming查询,基于自定义同义词文件的synonym查询,基于距离和顺序的相邻term查询.和like 相比,contains不能进行后缀匹配查询.如果Fulltext Index 能够满足业务需求,那么Fulltext Index是一个非常不错的选择,跟

关于jFinal Db.query与Db.find 的理解

1.Db.query,返回的是List<Model>类型,实际上返回的却是 Model 的数组: 2.Db.find,返回List<Reocrd>类型,实际上是recrod的 list: 3.所以相关Mode中的dao只有find,没有query,只有Db类中既有find也有query,可以灵活运用

一步一步跟我学习lucene(19)---lucene增量更新和NRT(near-real-time)Query近实时查询

这两天加班,不能兼顾博客的更新,请大家见谅. 有时候我们创建完索引之后,数据源可能有更新的内容,而我们又想像数据库那样能直接体现在查询中,这里就是我们所说的增量索引.对于这样的需求我们怎么来实现呢?lucene内部是没有提供这种增量索引的实现的: 这里我们一般可能会想到,将之前的索引全部删除,然后进行索引的重建.对于这种做法,如果数据源的条数不是特别大的情况下倒还可以,如果数据源的条数特别大的话,势必会造成查询数据耗时,同时索引的构建也是比较耗时的,几相叠加,势必可能造成查询的时候数据缺失的情况

【MongoDB】The basic operation of Mongodb, Insert\Query\Delete\Update

1, Insert MongoDB is database storing document object, the type of which is called Bson.(like JSON); Example:  // document defination Now after using command[db.posts.insert(doc)], you will insert record successfully if seeing the The following pictu

HDOJ 4010 Query on The Trees LCT

LCT: 分割.合并子树,路径上全部点的点权添加一个值,查询路径上点权的最大值 Query on The Trees Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65768/65768 K (Java/Others) Total Submission(s): 2582    Accepted Submission(s): 1208 Problem Description We have met so many problems