博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu4339 Query
阅读量:4628 次
发布时间:2019-06-09

本文共 3330 字,大约阅读时间需要 11 分钟。

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
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;#define maxn 1000100char 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); } } }}

转载于:https://www.cnblogs.com/herumw/p/9464778.html

你可能感兴趣的文章
Demon_背包系统(实现装备栏,背包栏,可以切换装备)
查看>>
记录:一次数据库被恶意修改配置文件的问题
查看>>
redis 持久化
查看>>
解决Jupyter notebook[import tensorflow as tf]报错
查看>>
Windows平台下使用ffmpeg和segmenter实现m3u8直播点播
查看>>
python网络画图——networkX
查看>>
ubuntu16.04文件形式安装mongodb
查看>>
SpringBoot------ActiveMQ安装
查看>>
详细了解 int? 类型
查看>>
字符串匹配 ?kmp : hash
查看>>
mongod.service: control process exited, code=exited status=1
查看>>
c# 发送邮件、附件 分类: C# 2014-12-...
查看>>
对360来说,江湖上再无“搜狗”这个传说
查看>>
composer
查看>>
OpenCV特征点检测——ORB特征
查看>>
ASP.NET性能优化之构建自定义文件缓存
查看>>
apicloud UISearchBar 使用方法
查看>>
【spring+websocket的使用】
查看>>
mongo二维数组操作
查看>>
localStorage之本地储存
查看>>