HDU 4339 Query
算法:
比赛时没有想到好的算法,暴力是O( Q * N )肯定超时。
赛后,线段树,树状数组,HASH都能AC,想了下,的确用树状数组
时间复杂度就可以优化到O(Q * lgN * lgN)
2000msAC.。。
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<iostream> #include<vector> #include<string> #include<math.h> #include<map> #include<set> #include<algorithm> using namespace std; #define MAXN 2000100 char str1[MAXN],str2[MAXN],str[10]; int dx[MAXN]; int N, lenmax, lenmin;int lowbit( int x ) { return x&-x; }void add( int x, int val, int M) {while( x <= M ){dx[x] += val;x += lowbit(x);} }int sum( int x ) {int num = 0;while( x > 0 ){num += dx[x];x -= lowbit( x ); } return num; }void pre( ) {int i = 1;int len1 = strlen(str1+1), len2 = strlen(str2+1);lenmin = len1 < len2 ? len1 : len2;while( i <= len1 ){if( str1[i] == str2[i] ){add(i, 1, lenmin); } i++; } }bool jugde(int start, int x) {int x1 = sum(start+x-1) - sum(start-1);if( x1 == x )return true;return false; }int find( int l, int r, int start) {int ans = 0;while( l <= r ){int mid = (l + r)/2;if( jugde(start,mid) ){ans = mid;l = mid + 1; }else r = mid - 1; }return ans; }int main( ) {int T, a, b, c, ans = 1;scanf("%d",&T);while( T-- ){scanf("%s%s",str1+1,str2+1); scanf("%d",&N);memset(dx,0,sizeof(dx));pre( );printf("Case %d:\n",ans++);for( int i = 1; i <= N; i++){scanf("%d",&a);if( a == 2 ){scanf("%d",&b);b++;printf("%d\n",find(0,lenmin,b));}else{ scanf("%d%d%s",&b,&c,str);c++; if( str1[c] == str2[c] && str[0] != str1[c] ){add(c,-1,lenmin);if( b == 1 )str1[c] = str[0];elsestr2[c] = str[0];}else if( str1[c] != str2[c] ){if( b == 1 ){if( str2[c] == str[0] ){add(c,1,lenmin); str1[c] = str[0]; }elsestr1[c] = str[0]; }else if( b == 2 ){if( str1[c] == str[0] ){add(c,1,lenmin); str2[c] = str[0]; } elsestr2[c] = str[0]; } } }} }return 0; }
HASH,要用到差值取模,时间复杂度为O( Q * lgN),写了一两个小时,还在调试中。。代码能力弱啊。。。
明天继续搞。。
郁闷啊。。从下到上的最大长度写了N久没写出,自己感觉真的不好写,从上到下真的很好写,利用回溯,写起来真的方便,自己。。
一直被标程的从下到上困扰,真的二,忘记了还可以从上到下。thanks 旭。。
#pragma comment(linker, "/STACK:16777216") #include<stdio.h> #include<stdlib.h> #include<string.h> #include<iostream> #include<vector> #include<string> #include<math.h> #include<map> #include<set> #include<algorithm> using namespace std; #define MAXN 1000010 #define Prime 29 #define LL long long struct node {int left, right;LL w1,w2; }seg[MAXN<<4]; char str1[MAXN], str2[MAXN], str[10]; LL P[MAXN]; int num[MAXN], nmax;void pre( ) {P[0] = 1;for( int i = 1; i <= 1000005; i++)P[i] = P[i-1] * Prime; }void build( int l, int r, int root ) {int mid = (l + r) / 2;seg[root].left = l;seg[root].right = r;if( l == r ){seg[root].w1 = str1[l];seg[root].w2 = str2[l];num[l] = root;return; }build(l, mid, root * 2 );build(mid+1,r,root * 2 + 1);seg[root].w1 = seg[root << 1].w1 + seg[(root<<1)+1].w1 * P[( seg[root<<1].right - seg[root<<1].left + 1)];seg[root].w2 = seg[root << 1].w2 + seg[(root<<1)+1].w2 * P[( seg[root<<1].right - seg[root<<1].left + 1)]; }void Modify( int root, int x, char c, int f) {int mid = (seg[root].left + seg[root].right) / 2;int l = seg[root].left;int r = seg[root].right;if( l == x && r == x ){if( f == 1 )seg[root].w1 = c ;elseseg[root].w2 = c ;return;}if( x > mid )Modify( (root << 1) + 1, x, c, f);elseModify( root << 1, x, c, f);if( f == 1 )seg[root].w1 = seg[root << 1].w1 + seg[(root<<1)+1].w1 * P[( seg[root<<1].right - seg[root<<1].left + 1)];elseseg[root].w2 = seg[root << 1].w2 + seg[(root<<1)+1].w2 * P[( seg[root<<1].right - seg[root<<1].left + 1)]; }int find( int p) {if( seg[p].w1 == seg[p].w2 ){return seg[p].right - seg[p].left + 1; }else if( seg[p].left != seg[p].right ){int ret = find( p << 1);if( ret == seg[p<<1].right - seg[p<<1].left + 1 ){ret += find( (p << 1) + 1); }return ret; }elsereturn 0; }int sum( int p, int x) {if( seg[p].left == seg[p].right ){if( seg[p].w1 == seg[p].w2 ){return 1; } elsereturn 0; } else{int mid = (seg[p].left + seg[p].right) / 2, ret;if( x <= mid ){ret = sum( p << 1, x );if( ret == seg[p<<1].right - x + 1 ) //左子树满的 {ret += find((p << 1) + 1);} } else{ret = sum( (p << 1) + 1, x ); }return ret; } }int main( ) {int N,T, a, b, c, abc = 1;scanf("%d",&T);pre( );while( T-- ){scanf("%s%s",str1,str2);scanf("%d",&N);int len1 = strlen(str1);int len2 = strlen(str2);nmax = len1 < len2 ? len1 : len2;build(0,nmax-1,1);printf("Case %d:\n",abc++);for( int i = 1; i <= N; i++){scanf("%d",&a);if( a == 2 ){scanf("%d",&b);if( b >= nmax ){puts("0");continue; }printf("%d\n",sum(1,b)); }else{scanf("%d%d%s",&b,&c,str);if( c >= nmax ){// puts("0");continue;}Modify(1,c,str[0], b);}}}return 0; }
转载于:https://www.cnblogs.com/tangcong/archive/2012/08/03/2622337.html
HDU 4339 Query相关推荐
- HDU 4339 - Query
题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=4339 12年多校 1009题. 方法: 树状数组+二分. 时间: O( n * logn * log ...
- HDU 4339 Query
题意: 有两个字符串,给出 Q 个询问,每个询问有两种方式: 1 p i c 把第 p 个字符串的第i 个字符换成 字符 c, 2 i 从位置i 开始,两个字符串连续相同的子串的最大长度为多 ...
- hdu 4339 Query ---线段树
给两个字符串, 1操作修改其中一个串的一个字符的值 2操作询问从 该字符串开始往后的 两个字符串 字符相同的长度 标记 字符相同为1,不同为0,每次修改相当于修改0,1值, zhi,标记每段的左值 , ...
- 树状数组 + 二分 - Query HDU - 4339
树状数组 + 二分 - Query HDU - 4339 题意: T组测试用例,每组给定两个长度分别为l1和l2的字符串s1,s2.有两种询问:①.1idic:将第id个字符串的第i个字符变成字符c. ...
- HDU - 3804 Query on a tree(主席树维护最大值+离散化)
题目链接:点击查看 题目大意:给出一棵树,每条边上都有一个权值,给出m个查询:a,b:问从点1到点a的唯一路径上,在边权小于等于b的边中选出边权最大的值输出,若没有符合条件的边则输出-1: 题目分析: ...
- HDU - 3804 Query on a tree(树链剖分+线段树+离线处理)
题目链接:点击查看 题目大意:给出一棵树,每条边上都有一个权值,给出m个查询:a,b:问从点1到点a的唯一路径上,在边权小于等于b的边中选出边权最大的值输出,若没有符合条件的边则输出-1: 题目分析: ...
- HDU - 6191 Query on A Tree
题意: 给出一个带点权的树.q次询问,每次询问给出u和x,求点u的子树中与x异或的最大值. 题解: 将询问离线化. 每颗节点动态建立字典树.每个节点和自己的孩子合并,但是这样会改变子树节点的字典树,所 ...
- hdu 4339 线段树+二分
题意是给你两个字符串 进行两种操作 1: 修改其中一个字符串里的某个字符2: 询问从i起两个字符串最多由多少个是相同的: 先说一下做之前的想法 ,我是看别人介绍树状数组是看到这道题的 ...
- faiss python安装_Faiss安装
使用Swift打造动态库SDK和DemoAPP时所遇到的(Xcode7.3) 使用Swift开发SDK的优点是,生成的SDK对于Obj-C或是Swift调用都不需要自己去建桥接文件,因为Swift的S ...
最新文章
- 简评《疯狂的石头》《超人归来 / Superman Returns》《谍中谍 3 / Mission Impossible 3》...
- vue父子组件生命周期顺序_vue父子组件生命周期执行顺序
- 安卓超过两行就加省略号_基础标点符号使用规则详解—8.省略号
- 平流式隔油池计算_隔油池计算方法及图集[参考提供]
- 边缘检测算法_机器视觉怎样检测产品边缘
- C++基础::STL中的定理
- mysql三阶段提交实现_基于两阶段提交的分布式事务实现(UP-2PC)
- 23种设计模式(十六)接口隔离之中介者
- oracle删除schema下所有对象,清空Schema中所有对象的步骤
- axure 彻底删除lib_axure-rplib
- 2022 数学建模B题 高教社杯 含半成品论文 部分代码 全部数学模型 和全套思路
- CA(载波聚合)和MIMO
- 联想如何打开计算机配置,联想电脑如何进入BIOS以及设置启动菜单
- 物联网常见通信模块介绍
- 统计文章字数和全站总字数
- iOS-使用第三方实现短信验证码功能
- 计算机二级怎么复习,全国计算机等级考试应该如何备考
- 2021-04-27 Android 理解frameworks services jni hardware kernel 整个控制过程实例包括回调
- java 之file文件/目录创建
- symfony ajax,Symfony2 AJAX登录
热门文章
- [机器学习]超参数优化算法-SuccessiveHalving与Hyperband
- CURL HTTPS POST
- Bash Shell学习笔记二
- 亚洲综合竞争力排名发布:韩国位居第1,中国第9,大家怎么看?
- leftjoin多个on条件_MYSQL|为什么LEFT JOIN会这么慢?
- rdd转换成java数据结构_如何将CSV文件转换为RDD
- python为什么虚部是j不是i_Python基础02 基本数据类型
- 内存泄漏java例子_一次线上Java应用内存泄漏分析实例
- 艾为数字ic面试题_每日学习:数字后端面试100问(2019全新版)
- 用友2020校招java笔试题_用友Java类笔试题大全