算法:

比赛时没有想到好的算法,暴力是O( Q * N )肯定超时。

赛后,线段树,树状数组,HASH都能AC,想了下,的确用树状数组

时间复杂度就可以优化到O(Q * lgN * lgN)

2000msAC.。。

View Code

#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 旭。。

View Code

#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相关推荐

  1. HDU 4339 - Query

    题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=4339 12年多校 1009题. 方法: 树状数组+二分. 时间: O( n * logn * log ...

  2. HDU 4339 Query

    题意: 有两个字符串,给出 Q 个询问,每个询问有两种方式: 1 p i c 把第 p 个字符串的第i 个字符换成 字符 c, 2 i      从位置i 开始,两个字符串连续相同的子串的最大长度为多 ...

  3. hdu 4339 Query ---线段树

    给两个字符串, 1操作修改其中一个串的一个字符的值 2操作询问从 该字符串开始往后的 两个字符串 字符相同的长度 标记 字符相同为1,不同为0,每次修改相当于修改0,1值, zhi,标记每段的左值 , ...

  4. 树状数组 + 二分 - Query HDU - 4339

    树状数组 + 二分 - Query HDU - 4339 题意: T组测试用例,每组给定两个长度分别为l1和l2的字符串s1,s2.有两种询问:①.1idic:将第id个字符串的第i个字符变成字符c. ...

  5. HDU - 3804 Query on a tree(主席树维护最大值+离散化)

    题目链接:点击查看 题目大意:给出一棵树,每条边上都有一个权值,给出m个查询:a,b:问从点1到点a的唯一路径上,在边权小于等于b的边中选出边权最大的值输出,若没有符合条件的边则输出-1: 题目分析: ...

  6. HDU - 3804 Query on a tree(树链剖分+线段树+离线处理)

    题目链接:点击查看 题目大意:给出一棵树,每条边上都有一个权值,给出m个查询:a,b:问从点1到点a的唯一路径上,在边权小于等于b的边中选出边权最大的值输出,若没有符合条件的边则输出-1: 题目分析: ...

  7. HDU - 6191 Query on A Tree

    题意: 给出一个带点权的树.q次询问,每次询问给出u和x,求点u的子树中与x异或的最大值. 题解: 将询问离线化. 每颗节点动态建立字典树.每个节点和自己的孩子合并,但是这样会改变子树节点的字典树,所 ...

  8. hdu 4339 线段树+二分

    题意是给你两个字符串    进行两种操作   1: 修改其中一个字符串里的某个字符2:   询问从i起两个字符串最多由多少个是相同的: 先说一下做之前的想法   ,我是看别人介绍树状数组是看到这道题的 ...

  9. faiss python安装_Faiss安装

    使用Swift打造动态库SDK和DemoAPP时所遇到的(Xcode7.3) 使用Swift开发SDK的优点是,生成的SDK对于Obj-C或是Swift调用都不需要自己去建桥接文件,因为Swift的S ...

最新文章

  1. 简评《疯狂的石头》《超人归来 / Superman Returns》《谍中谍 3 / Mission Impossible 3》...
  2. vue父子组件生命周期顺序_vue父子组件生命周期执行顺序
  3. 安卓超过两行就加省略号_基础标点符号使用规则详解—8.省略号
  4. 平流式隔油池计算_隔油池计算方法及图集[参考提供]
  5. 边缘检测算法_机器视觉怎样检测产品边缘
  6. C++基础::STL中的定理
  7. mysql三阶段提交实现_基于两阶段提交的分布式事务实现(UP-2PC)
  8. 23种设计模式(十六)接口隔离之中介者
  9. oracle删除schema下所有对象,清空Schema中所有对象的步骤
  10. axure 彻底删除lib_axure-rplib
  11. 2022 数学建模B题 高教社杯 含半成品论文 部分代码 全部数学模型 和全套思路
  12. CA(载波聚合)和MIMO
  13. 联想如何打开计算机配置,联想电脑如何进入BIOS以及设置启动菜单
  14. 物联网常见通信模块介绍
  15. 统计文章字数和全站总字数
  16. iOS-使用第三方实现短信验证码功能
  17. 计算机二级怎么复习,全国计算机等级考试应该如何备考
  18. 2021-04-27 Android 理解frameworks services jni hardware kernel 整个控制过程实例包括回调
  19. java 之file文件/目录创建
  20. symfony ajax,Symfony2 AJAX登录

热门文章

  1. [机器学习]超参数优化算法-SuccessiveHalving与Hyperband
  2. CURL HTTPS POST
  3. Bash Shell学习笔记二
  4. 亚洲综合竞争力排名发布:韩国位居第1,中国第9,大家怎么看?
  5. leftjoin多个on条件_MYSQL|为什么LEFT JOIN会这么慢?
  6. rdd转换成java数据结构_如何将CSV文件转换为RDD
  7. python为什么虚部是j不是i_Python基础02 基本数据类型
  8. 内存泄漏java例子_一次线上Java应用内存泄漏分析实例
  9. 艾为数字ic面试题_每日学习:数字后端面试100问(2019全新版)
  10. 用友2020校招java笔试题_用友Java类笔试题大全