线段树、KMP、HASH模板
线段树
- #include<cstdio>
- using namespace std;
- int n,p,a,b,m,x,y,ans;
- struct node
- {
- int l,r,w,f;
- }tree[];
- inline void build(int k,int ll,int rr)//建树
- {
- tree[k].l=ll,tree[k].r=rr;
- if(tree[k].l==tree[k].r)
- {
- scanf("%d",&tree[k].w);
- return;
- }
- int m=(ll+rr)/;
- build(k*,ll,m);
- build(k*+,m+,rr);
- tree[k].w=tree[k*].w+tree[k*+].w;
- }
- inline void down(int k)//标记下传
- {
- tree[k*].f+=tree[k].f;
- tree[k*+].f+=tree[k].f;
- tree[k*].w+=tree[k].f*(tree[k*].r-tree[k*].l+);
- tree[k*+].w+=tree[k].f*(tree[k*+].r-tree[k*+].l+);
- tree[k].f=;
- }
- inline void ask_point(int k)//单点查询
- {
- if(tree[k].l==tree[k].r)
- {
- ans=tree[k].w;
- return ;
- }
- if(tree[k].f) down(k);
- int m=(tree[k].l+tree[k].r)/;
- if(x<=m) ask_point(k*);
- else ask_point(k*+);
- }
- inline void change_point(int k)//单点修改
- {
- if(tree[k].l==tree[k].r)
- {
- tree[k].w+=y;
- return;
- }
- int m=(tree[k].l+tree[k].r)/;
- if(x<=m) change_point(k*);
- else change_point(k*+);
- tree[k].w=tree[k*].w+tree[k*+].w;
- }
- inline void ask_interval(int k)//区间查询
- {
- if(tree[k].l>=a&&tree[k].r<=b)
- {
- ans+=tree[k].w;
- return;
- }
- if(tree[k].f) down(k);
- int m=(tree[k].l+tree[k].r)/;
- if(a<=m) ask_interval(k*);
- if(b>m) ask_interval(k*+);
- }
- inline void change_interval(int k)//区间修改
- {
- if(tree[k].l>=a&&tree[k].r<=b)
- {
- tree[k].w+=(tree[k].r-tree[k].l+)*y;
- tree[k].f+=y;
- return;
- }
- if(tree[k].f) down(k);
- int m=(tree[k].l+tree[k].r)/;
- if(a<=m) change_interval(k*);
- if(b>m) change_interval(k*+);
- tree[k].w=tree[k*].w+tree[k*+].w;
- }
- int main()
- {
- scanf("%d",&n);//n个节点
- build(,,n);//建树
- scanf("%d",&m);//m种操作
- for(int i=;i<=m;i++)
- {
- scanf("%d",&p);
- ans=;
- if(p==)
- {
- scanf("%d",&x);
- ask_point(x);//单点查询,输出第x个数
- printf("%d",ans);
- }
- else if(p==)
- {
- scanf("%d%d",&x,&y);
- change_point();//单点修改
- }
- else if(p==)
- {
- scanf("%d%d",&a,&b);//区间查询
- ask_interval();
- printf("%d\n",ans);
- }
- else
- {
- scanf("%d%d%d",&a,&b,&y);//区间修改
- change_interval();
- }
- }
- }
KMP
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #include<cstdlib>
- #include<cmath>
- using namespace std;
- char a[];
- char b[];
- int nxt[];
- int la,lb;
- void makenext()
- {
- int k=-,j=;
- nxt[j]=k;
- while(j<lb)
- {
- if(k==-||b[j]==b[k])
- {
- k++,j++;
- nxt[j]=k;
- }
- else
- k=nxt[k];
- }
- }
- void kmp()
- {
- makenext();
- int i=,j=;
- while(i<la)
- {
- if(j==-||a[i]==b[j])
- j++,i++;
- else
- j=nxt[j];
- if(j==lb)
- {
- cout<<i-lb+<<endl;
- j=,i--;
- }
- }
- }
- int main()
- {
- cin>>a;
- cin>>b;
- la=strlen(a);
- lb=strlen(b);
- kmp();
- for(int i=;i<=lb;i++)
- cout<<nxt[i]<<" ";
- return ;
- }
HASH
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #include<cstdlib>
- #include<cmath>
- #define num 500003
- using namespace std;
- int hash[*num];
- int star[];
- bool vis[];
- int main()
- {
- memset(hash,-,sizeof(hash));
- int n;
- cin>>n;
- for(int i=;i<n;i++)
- {
- int x;
- bool mark=;
- cin>>x;
- int y=abs(x)%num;
- while(hash[y]>=-)
- {
- if(hash[y]==x)
- {
- mark=;
- break;
- }
- y++;
- }
- hash[y]=x;
- if(mark==)
- cout<<;
- else
- cout<<;
- }
- return ;
- }
模板来源
http://www.cnblogs.com/IUUUUUUUskyyy/
线段树、KMP、HASH模板的更多相关文章
- 线段树 + 字符串Hash - Codeforces 580E Kefa and Watch
Kefa and Watch Problem's Link Mean: 给你一个长度为n的字符串s,有两种操作: 1 L R C : 把s[l,r]全部变为c; 2 L R d : 询问s[l,r]是 ...
- cf213E 线段树维护hash
链接 https://codeforces.com/contest/213/problem/E 题目大意 给出两个排列a.b,长度分别为n.m,你需要计算有多少个x,使 得\(a_1 + x; a_2 ...
- MemSQL Start[c]UP 2.0 - Round 1 F - Permutation 思维+线段树维护hash值
F - Permutation 思路:对于当前的值x, 只需要知道x + k, x - k这两个值是否出现在其左右两侧,又因为每个值只有一个, 所以可以转换成,x+k, x-k在到x所在位置的时候是否 ...
- hdu1698(线段树区间替换模板)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1698 题意: 第一行输入 t 表 t 组测试数据, 对于每组测试数据, 第一行输入一个 n , 表示 ...
- BZOJ 2124: 等差子序列 线段树维护hash
2124: 等差子序列 Description 给一个1到N的排列{Ai},询问是否存在1<=p1=3),使得Ap1,Ap2,Ap3,…ApLen是一个等差序列. Input 输入的第一行包含一 ...
- 【BZOJ 3196】二逼平衡树 线段树套splay 模板题
我写的是线段树套splay,网上很多人写的都是套treap,然而本蒟蒻并不会treap 奉上sth神犇的模板: //bzoj3196 二逼平衡树,支持修改某个点的值,查询区间第k小值,查询区间某个值排 ...
- POJ 3468:A Simple Problem with Integers(线段树区间更新模板)
A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 141093 ...
- bzoj 2124 等差子序列 (线段树维护hash)
2124: 等差子序列 Time Limit: 3 Sec Memory Limit: 259 MBSubmit: 1922 Solved: 714[Submit][Status][Discuss ...
- 【luogu P3372 线段树1】 模板
线段树的模板题 题目链接:https://www.luogu.org/problemnew/show/P3372 update区间修改,query区间求和 #include <iostream& ...
- 【线段树 集合hash】bzoj4373: 算术天才⑨与等差数列
hash大法好(@ARZhu):大数相乘及时取模真的是件麻烦事情 Description 算术天才⑨非常喜欢和等差数列玩耍.有一天,他给了你一个长度为n的序列,其中第i个数为a[i].他想考考你,每次 ...
随机推荐
- 洛谷 - P2762 - 太空飞行计划问题 - 最小割
https://www.luogu.org/problemnew/solution/P2762 最小割对应的点,在最后一次更新中dinic的bfs会把他的dep重置掉.所以可以根据这个性质复原最小割. ...
- POJ1503
大数+++++ #include<cstdio> #include<string.h> #include<iostream> #include<algorit ...
- poj 1182 食物链【带权并查集】
设相等的边权为0,吃的边权为,被吃的边权为2,然后用带权并查集在%3的意义下做加法即可 关系为简单环的基本都可以用模环长的方式是用带权并查集 #include<iostream> #inc ...
- 1856: [Scoi2010]字符串(Catalan数)
1856: [Scoi2010]字符串 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 2117 Solved: 1211[Submit][Status] ...
- 【HDU - 1257】最少拦截系统(贪心)
最少拦截系统 Descriptions: 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能超过前一发的 ...
- 正睿OI提高组十连测 day1 总结
可能是最简单的一场比赛了吧,结果却打得这么差... T1是个找规律题,结果一开始愚蠢地找错了规律,然后又对拍,到1h多一点才过掉 然后看t2和t3,以为t2是个水题,t3也只要处理一下就好了,先写t2 ...
- URAL 7077 Little Zu Chongzhi's Triangles(14广州I)
题目传送门 题意:有n根木棍,三根可能能够构成三角形,选出最多的三角形,问最大面积 分析:看到这个数据范围应该想到状压DP,这次我想到了.0010101的状态中,1表示第i根木棍选择,0表示没选,每一 ...
- centOS 部署服务器(一)
接下来我所写的博客仅仅是为了记录我的学习过程,与其他无关. 由于公司换用了亚马逊服务器,用的是它的RDS数据库,所以就没有像以前的项目部署的时候使用mysql,不过要下载安装mysql-proxy,字 ...
- 快速分页:jsp标签pager-taglib
一:简介 Pager-taglib,支持多种风格的分页显示.实际上它是一个Jsp标签库,为在JSP上显示分页信息而设计的一套标签,通过这些标签的不同的组 合,会形成多种不一样的分页页面,风格各异.它既 ...
- 自己写的MD5加密原码
package com.wh.md5; import java.security.MessageDigest; import java.util.Arrays; /** * @author 王恒 * ...