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);
}
}
}
}

hdu4339 Query的更多相关文章

  1. 以bank account 数据为例,认识elasticsearch query 和 filter

    Elasticsearch 查询语言(Query DSL)认识(一) 一.基本认识 查询子句的行为取决于 query context filter context 也就是执行的是查询(query)还是 ...

  2. 相关query挖掘

    1.何为相关query 我通常也把相关query称为相似query,搜索日志中一个用户在短时间内的一系列搜索词被称为相关query.相关就是两个query间有一定的关系,反映了用户在当时的需求.本文就 ...

  3. 第三篇 Entity Framework Plus 之 Query Cache

    离上一篇博客,快一周,工作太忙,只能利用休息日来写一些跟大家分享,Entity Framework Plus 组件系列文章,之前已经写过两篇 第一篇 Entity Framework Plus 之 A ...

  4. 第二篇 Entity Framework Plus 之 Query Future

    从性能的角度出发,能够减少 增,删,改,查,跟数据库打交道次数,肯定是对性能会有所提升的(这里单纯是数据库部分). 今天主要怎样减少Entity Framework查询跟数据库打交道的次数,来提高查询 ...

  5. FunDA(1)- Query Result Row:强类型Query结果行

    FunDA的特点之一是以数据流方式提供逐行数据操作支持.这项功能解决了FRM如Slick数据操作以SQL批次模式为主所产生的问题.为了实现安全高效的数据行操作,我们必须把FRM产生的Query结果集转 ...

  6. 细谈Slick(6)- Projection:ProvenShape,强类型的Query结果类型

    在Slick官方文档中描述:连接后台数据库后,需要通过定义Projection,即def * 来进行具体库表列column的选择和排序.通过Projection我们可以选择库表中部分列.也可以增加一些 ...

  7. elasticsearch__5__java操作之FilterBuilders构建过滤器Query

    FilterBuilders构建过滤器Query 代码如下: package com.elasticsearch; import org.elasticsearch.action.ActionList ...

  8. [LeetCode] Range Sum Query 2D - Mutable 二维区域和检索 - 可变

    Given a 2D matrix matrix, find the sum of the elements inside the rectangle defined by its upper lef ...

  9. [LeetCode] Range Sum Query - Mutable 区域和检索 - 可变

    Given an integer array nums, find the sum of the elements between indices i and j (i ≤ j), inclusive ...

随机推荐

  1. Writing in the science: Introducion

    1.what makes a good writing? 2.what makes a good writer? 1) have something to say 2) logical thinkin ...

  2. Mysql数据类型以及特性,,,防止SQL注入

    MyISAM.InnoDB.HEAP.BOB,ARCHIVE,CSV等 MyISAM:成熟.稳定.易于管理,快速读取.一些功能不支持(事务等),表级锁. InnoDB:支持事务.外键等特性.数据行锁定 ...

  3. Java 多线程读取文件并统计词频 实例 出神入化的《ThreadPoolExecutor》

    重在展示多线程ThreadPoolExecutor的使用,和线程同步器CountDownLatch,以及相关CAS的原子操作和线程安全的Map/队列. ThreadPool主线程 1 import j ...

  4. Linux Shell 编程基础详解——吐血整理,墙裂推荐!

    第一部分:Linux Shell 简介 Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁.Shell 既是一种命令语言,又是一种程序设计语言. Shell 是指一种应用程序, ...

  5. Kafka 探险 - 生产者源码分析: 核心组件

    这个 Kafka 的专题,我会从系统整体架构,设计到代码落地.和大家一起杠源码,学技巧,涨知识.希望大家持续关注一起见证成长! 我相信:技术的道路,十年如一日!十年磨一剑! 往期文章 Kafka 探险 ...

  6. Netty学习:伪共享

    目录 Netty中的伪共享 伪共享的原理以及介绍 Netty中的伪共享 先说为什么知道这个概念吧,期初看Netty源码的时候,看到了NioEventLoop的构建,其中有这么一句代码: private ...

  7. 原生js制作表单验证,基本的表单验证方法

    表单验证是web前端最常见的功能之一,也属于前端开发的基本功.自己完成一个表单验证的开发,也有助于加深对字符串处理和正则表达式的理解. 基本的表单验证包括如:字母验证.数字验证.字母和数字验证.汉字验 ...

  8. JavaSE 基础知识(常识概念 + 基础语法)问答总结/面试题 —— 讲给应届生的 Java 开源知识项目

    写在最前面 这个项目是从20年末就立好的 flag,经过几年的学习,回过头再去看很多知识点又有新的理解.所以趁着找实习的准备,结合以前的学习储备,创建一个主要针对应届生和初学者的 Java 开源知识项 ...

  9. 2020年12月18号--21号 人工智能(深度学习DeepLearning)python、TensorFlow技术实战

    深度学习DeepLearning(Python)实战培训班 时间地点: 2020 年 12 月 18 日-2020 年 12 月 21日 (第一天报到 授课三天:提前环境部署 电脑测试) 一.培训方式 ...

  10. 从软件(Java/hotspot/Linux)到硬件(硬件架构)分析互斥操作的本质

    先上结论: 一切互斥操作的依赖是 自旋锁(spin_lock),互斥量(semaphore)等其他需要队列的实现均需要自选锁保证临界区互斥访问. 而自旋锁需要xcmpchg等类似的可提供CAS操作的硬 ...