
常用代码
qingwen_z
这个作者很懒,什么都没留下…
展开
-
树状数组
#define lowbit(x) (x&(-x))int const maxn=3333;int tree[maxn],n;void add(int p,int val){ while(p<=n) { tree[p]+=val; p+=lowbit(p); }}int getsum(int p){ int sum=0; while(p>0) { sum原创 2013-04-04 18:58:48 · 405 阅读 · 0 评论 -
AC自动机
const int maxn=10000010,M=26;struct node{ int num; node *nt[M],*fail; void init() { num=0; for(int i=0;i<M;i++) nt[i]=NULL; fail=NULL; }}T[maxn];#define root Tint cnt;void insert(ch原创 2013-07-26 16:02:34 · 394 阅读 · 0 评论 -
SBT
const int maxn=50010;const int INF=0x3f3f3f3f;struct SBT { int key,left,right,size; } tree[maxn]; int root,top; void left_rot(int &x) { int y = tree[x].right; tree[翻译 2013-08-27 16:25:25 · 451 阅读 · 0 评论 -
高斯消元借模线性同余方程
int gcd(int a,int b) { return b==0?a:gcd(b,a%b); }int lcm(int a,int b) { return a/gcd(a,b)*b; }int a[maxn][maxn],x[maxn];int equ,var;int Gauss(){ int i,j,k,max_r,col; int LCM,tmp,ta,tb; fo转载 2013-08-18 14:23:18 · 559 阅读 · 0 评论 -
manacher求最长回文子串
const int MAXN=110010;char Ma[MAXN*2];int Mp[MAXN*2];void Manacher(char s[],int len){ int l=0; Ma[l++]='$'; Ma[l++]='#'; for(int i=0;i<len;i++) { Ma[l++]=s[i]; Ma[l++]='#'; } Ma[l]=0;转载 2013-09-25 13:53:19 · 338 阅读 · 0 评论 -
AC自动机数组写法
const int maxlen=110,kind=26;struct Trie{ int nt[maxlen][kind],fail[maxlen],end[maxlen]; int root,L; int newnode() { for(int i=0;i<kind;i++) nt[L][i]=-1; end[L++]=0; return L-1; } void转载 2013-09-26 16:40:04 · 1036 阅读 · 0 评论 -
sap
#include#define min(a,b) ((a)<(b)?(a):(b))const int MAX=2100000000,MAXn=200+9;int n,answer,g[MAXn][MAXn],d[MAXn],gap[MAXn],st=1,ed=n;int sap(int u,int flow){ if(u==ed) return flow; int res=fl转载 2013-10-27 22:53:48 · 567 阅读 · 0 评论 -
splay
#include #include #include #include #define N 100001using namespace std;int n, a[N], b[N];int size, p[N], s[N], o[N], c[N][2];void update(int x){ s[x] = s[c[x][0]] + s[c[x][1]] + 1; o[x转载 2014-01-22 23:45:13 · 489 阅读 · 0 评论 -
后缀数组
// 倍增算法int wa[maxn],wb[maxn],wv[maxn],wss[maxn];int rank[maxn],height[maxn],sa[maxn];int cmp(int *r,int a,int b,int l){return r[a]==r[b]&&r[a+l]==r[b+l];}void da(int *r,int *sa,int n,int m){原创 2014-03-15 21:54:01 · 439 阅读 · 0 评论 -
FFT
#include#include#include#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;#define LL long long#define pi (acos(-1.0))原创 2013-07-26 14:12:48 · 441 阅读 · 0 评论 -
扩展KMP
#include#includeusing namespace std;const int MM=100005;int next[MM],extand[MM];char S[MM],T[MM];void GetNext(const char *T){ int len=strlen(T),a=0; next[0]=len; while(a<len-1 &&原创 2013-07-01 22:40:39 · 376 阅读 · 0 评论 -
最长公共字串
#include #include #include using namespace std; #define N 1005 char str1[N], str2[N]; int LCS(){ int num[2][N], i, j, k; memset(num, 0, sizeof(num)); for( i = 0; i < strlen(str1);原创 2013-04-05 00:46:18 · 737 阅读 · 0 评论 -
并查集
const int maxn=333;int n;int parent[maxn];void UFSet(){ for(int i=0;i<=n;i++) parent[i]=-1;}int find(int x){ int s=x; while(parent[s]>0) s=parent[s]; int tmp; while(s!=x) { tmp=pa原创 2013-04-04 19:01:16 · 473 阅读 · 0 评论 -
高精度运算
const int MAXN = 410; struct bign { int len, s[MAXN]; bign () { memset(s, 0, sizeof(s)); len = 1; } bign (int num) { *this = num; } bign原创 2013-04-25 18:12:25 · 444 阅读 · 0 评论 -
扩展欧几里得
struct eu{ int a,b,x,y,q; void extend_euclid(int a,int b) { if(b==0) { x=1;y=0;q=a; } else { extend_euclid(b,a%b); int tmp=x; x=y;y=tmp-a/b*y; } }};原创 2013-05-06 22:52:42 · 393 阅读 · 0 评论 -
字典树
struct node{ bool flag; node *next[2]; node() { next[0]=next[1]=NULL; flag=false; }};void insert(node *&root ,string word){ if(root==NULL) root=new node(); node *p=root; for(int i=0;i原创 2013-06-09 11:58:59 · 462 阅读 · 0 评论 -
KMP
void getpre(char *s){ int j=-1,i; p[0]=-1; int n=strlen(s); for(i=1;i<n;i++) { while(j>=0&&s[j+1]!=s[i]) j=p[j]; if(s[j+1]==s[i]) j++; p[i]=j; }}void kmp(){ int j=-1,i,n=strlen(sa),m原创 2013-06-21 23:14:53 · 500 阅读 · 0 评论 -
动态树
#define NMax 10000struct node{ int key,mn,delta; int revmark; node *p,*l,*r; node(){}};struct DynamicTree{ node *nodes; int N; static void ini_node(node *p){ p->p=p->l=p->r=NULL; p->revm原创 2013-06-25 09:28:50 · 410 阅读 · 0 评论 -
miller素数测试
#define N 5LL random(LL n){ return (LL)((double)rand()/RAND_MAX*n+0.5);}LL multi(LL a,LL b,LL m) //(a*b)%m{ LL ans=0; while(b>0) { if(b&1) ans=(ans+a)%m; b>>=1; a=(a+a)%m; } return a原创 2013-07-14 15:54:19 · 405 阅读 · 0 评论 -
Pollard整数分解
#include#include#include#include#include#includeusing namespace std;//****************************************************************// Miller_Rabin 算法进行素数测试//速度快,而且可以判断 <2^63的数//******原创 2013-07-14 17:11:21 · 501 阅读 · 0 评论