1.快速排序
//Twenty
#include#include#include#include#include#include#include#include#include
const int maxn=100005;using namespacestd;intn,a[maxn];
template void read(T &x) {char ch=getchar(); T f=1; x=0;while(ch!='-'&&(ch'9')) ch=getchar();if(ch=='-') f=-1,ch=getchar();for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0'; x*=f;
}void qsort(int *s,int l,intr) {int bs=s[rand()%(r-l+1)+l];int i=l,j=r;while(i<=j) {while(s[j]>bs) j--;while(s[i]
swap(s[i],s[j]);
i++; j--;
}
}if(j>l) qsort(s,l,j);if(i
}voidwork() {
qsort(a,1,n);for(int i=1;i
printf("%d\n",a[n]);
}voidinit() {
read(n);for(int i=1;i<=n;i++) read(a[i]);
}intmain() {
#ifdef DEBUG
freopen(".in","r",stdin);
freopen(".out","w",stdout);#endifsrand(time(0));
init();
work();return 0;
}
View Code
2.归并排序
//Twenty
#include#include#include#include#include#include#include#include#include
const int maxn=100005;using namespacestd;intn,a[maxn];
template void read(T &x) {char ch=getchar(); T f=1; x=0;while(ch!='-'&&(ch'9')) ch=getchar();if(ch=='-') f=-1,ch=getchar();for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0'; x*=f;
}inttp[maxn];void msort(int *s,int l,intr) {if(l>=r) return;int mid=((l+r)>>1);
msort(s,l,mid); msort(s,mid+1,r);int tl=l,i=l,j=mid+1;while(tl<=r) {if(i<=mid&&(j>r||s[i]
}for(int i=l;i<=r;i++) s[i]=tp[i];
}voidwork() {
msort(a,1,n);for(int i=1;i
printf("%d\n",a[n]);
}voidinit() {
read(n);for(int i=1;i<=n;i++) read(a[i]);
}intmain() {
#ifdef DEBUG
freopen(".in","r",stdin);
freopen(".out","w",stdout);#endifsrand(time(0));
init();
work();return 0;
}
View Code
3.kmp
//Twenty雨欲予鱼愉
#include#include#include#include#include#include#include#include
const int maxn=1000007;using namespacestd;chara[maxn],b[maxn];intnxt[maxn],ans[maxn],sza,szb;void make_nxt(char b[],intnxt[]) {for(int i=1,k=0;i
nxt[i]=k;
}
}void kmp(char a[],char b[],intnxt[]) {
make_nxt(b,nxt);for(int i=0,k=0;i
}
}voidwork() {
kmp(a,b,nxt);for(int i=1;i<=ans[0];i++)
printf("%d\n",ans[i]);for(int i=0;i
printf("%d\n",nxt[szb-1]);
}voidinit() {
scanf("%s",a);
getchar();
scanf("%s",b);
sza=strlen(a);
szb=strlen(b);
}intmain() {
#ifdef DEBUG
freopen(".in","r",stdin);
freopen(".out","w",stdout);#endifinit();
work();return 0;
}
View Code
4.SLF优化的spfa
//Twenty雨欲予鱼愉
#include#include#include#include#include#include#include#include
const int maxn=10005;const int maxm=500007;using namespacestd;intdis[maxn],n,m,s;
templatevoid read(T &x) {char ch=getchar(); x=0; T f=1;while(ch!='-'&&(ch'9')) ch=getchar();if(ch=='-') ch=getchar(),f=-1;for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0'; x*=f;
}intecnt,fir[maxn],nxt[maxm],to[maxm],val[maxm];void add(int u,int v,intw) {
nxt[++ecnt]=fir[u]; fir[u]=ecnt; to[ecnt]=v; val[ecnt]=w;
}int que[maxm+5],ql=1,qr=0,vis[maxn];void spfa(ints) {for(int i=1;i<=n;i++) dis[i]=2147483647;
memset(vis,0,sizeof(vis));
dis[s]=0;
vis[s]=1;
que[++qr]=s;while(ql<=qr) {int x=que[(ql+maxm)%maxm];
ql++;
vis[x]=0;for(int i=fir[x];i;i=nxt[i]) {if(dis[to[i]]>dis[x]+val[i]) {
dis[to[i]]=dis[x]+val[i];if(!vis[to[i]]) {
vis[to[i]]=1;if(ql<=qr&&(dis[que[(ql+maxm)%maxm]]>dis[to[i]])) {
ql--;
que[(ql+maxm)%maxm]=to[i];
}else{
qr++;
que[(qr+maxm)%maxm]=to[i];
}
}
}
}
}
}voidwork() {
spfa(s);for(int i=1;i<=n;i++)
printf("%d",dis[i]);
printf("\n");
}voidinit() {
read(n);
read(m);
read(s);for(int i=1;i<=m;i++) {intx,y,z;
read(x); read(y); read(z);
add(x,y,z);
}
}intmain() {
#ifdef DEBUG
freopen(".in","r",stdin);
freopen(".out","w",stdout);#endifinit();
work();return 0;
}
View Code
5.堆优化的dijkstra
//Twenty雨欲予鱼愉
#include#include#include#include#include#include#include#include
const int maxn=10005;const int maxm=500007;using namespacestd;intdis[maxn],n,m,s;
templatevoid read(T &x) {char ch=getchar(); x=0; T f=1;while(ch!='-'&&(ch'9')) ch=getchar();if(ch=='-') ch=getchar(),f=-1;for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0'; x*=f;
}intecnt,fir[maxn],nxt[maxm],to[maxm],val[maxm];void add(int u,int v,intw) {
nxt[++ecnt]=fir[u]; fir[u]=ecnt; to[ecnt]=v; val[ecnt]=w;
}structnode {intx,dis;
node(){}
node(int x,intdis):x(x),dis(dis){}
friendbool operator B.dis;
}
};
priority_queueque;intvis[maxn];void spfa(ints) {for(int i=1;i<=n;i++) dis[i]=2147483647;
memset(vis,0,sizeof(vis));
dis[s]=0;
que.push(node(s,0));while(!que.empty()) {
node tp=que.top();int x=tp.x;
que.pop();if(vis[x]) continue;
vis[x]=1;for(int i=fir[x];i;i=nxt[i])if(!vis[to[i]]&&dis[to[i]]>dis[x]+val[i]) {
dis[to[i]]=dis[x]+val[i];
que.push(node(to[i],dis[to[i]]));
}
}
}voidwork() {
spfa(s);for(int i=1;i<=n;i++)
printf("%d",dis[i]);
printf("\n");
}voidinit() {
read(n);
read(m);
read(s);for(int i=1;i<=m;i++) {intx,y,z;
read(x); read(y); read(z);
add(x,y,z);
}
}intmain() {
#ifdef DEBUG
freopen(".in","r",stdin);
freopen(".out","w",stdout);#endifinit();
work();return 0;
}
View Code
6.左偏树
//Twenty雨欲予鱼愉
#include#include#include#include#include#include#include#include
const int maxn=100000+299;using namespacestd;int a[maxn],n,m,bo[maxn],fa[maxn],dis[maxn],ch[maxn][2];
templatevoid read(T &x) {char ch=getchar(); x=0; T f=1;while(ch!='-'&&(ch'9')) ch=getchar();if(ch=='-') ch=getchar(),f=-1;for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0'; x*=f;
}int find(int x) {return x==fa[x]?x:fa[x]=find(fa[x]);}#define lc ch[x][0]
#define rc ch[x][1]
int merge(int x,inty) {if(!(x*y)) return x^y;if(a[x]>a[y]) swap(x,y);
fa[y]=x;
rc=merge(rc,y);if(dis[rc]>dis[lc]) swap(lc,rc);if(!rc) dis[x]=0;else dis[x]=dis[rc]+1;returnx;
}voidwork() {for(int i=1;i<=m;i++) {into,x,y;
read(o);if(o==1) {
read(x);
read(y);if(!bo[x]&&!bo[y]&&(find(x)!=find(y)))
x=merge(find(x),find(y));
}else{
read(x);if(bo[x]) {
printf("-1\n");continue;
}
x=find(x);
printf("%d\n",a[x]);
fa[lc]=lc; fa[rc]=rc;
lc=merge(lc,rc);if(!lc) fa[x]=rc;else fa[x]=lc;
lc=rc=0;
bo[x]=1;
}
}
}voidinit() {
read(n);
read(m);for(int i=1;i<=n;i++) {
read(a[i]);
fa[i]=i;
}
}intmain() {
#ifdef DEBUG
freopen(".in","r",stdin);
freopen(".out","w",stdout);#endifinit();
work();return 0;
}
View Code
7.线性筛素数
//Twenty
#include#include#include#include#include#include#include#include
using namespacestd;const int maxn=10000007;intn,m,p[maxn];boolbo[maxn];
templatevoid read(T &x) {char ch=getchar(); x=0; T f=1;while(ch!='-'&&(ch'9')) ch=getchar();if(ch=='-') ch=getchar(),f=-1;for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0'; x*=f;
}void get_prime(intn) {
bo[1]=1;for(int i=2;i<=n;i++) {if(!bo[i]) p[++p[0]]=i;for(int j=1;j<=p[0]&&p[j]*i<=n;j++) {
bo[p[j]*i]=1;if(i%p[j]==0) break;
}
}
}voidinit() {
read(n);
get_prime(n);
read(m);for(int i=1;i<=m;i++) {intx; read(x);if(bo[x]) printf("No\n");else printf("Yes\n");
}
}intmain() {
#ifdef DEBUG
freopen(".in","r",stdin);
freopen(".out","w",stdout);#endifinit();return 0;
}
View Code
8.二分图最大匹配 匈牙利
//Twenty雨欲予鱼愉
#include#include#include#include#include#include#include#include
const int maxn=2005;using namespacestd;intn,m,e,pr[maxn],vis[maxn],ans;
templatevoid read(T &x) {char ch=getchar(); x=0; T f=1;while(ch!='-'&&(ch'9')) ch=getchar();if(ch=='-') ch=getchar(),f=-1;for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0'; x*=f;
}int ecnt,fir[maxn],nxt[maxn*maxn],to[maxn*maxn];void add(int u,intv) {
nxt[++ecnt]=fir[u]; fir[u]=ecnt; to[ecnt]=v;
}int find(intx) {for(int i=fir[x];i;i=nxt[i]) if(!vis[to[i]]){int y=to[i];
vis[y]=1;if(!pr[y]||find(pr[y])) {
pr[y]=x;return 1;
}
}return 0;
}voidwork() {for(int i=1;i<=n;i++) {
memset(vis,0,sizeof(vis));
ans+=find(i);
}
printf("%d\n",ans);
}voidinit() {
read(n);
read(m);
read(e);for(int i=1;i<=e;i++) {intx,y;
read(x);
read(y);if(x<=n&&y<=m)
add(x,y);
}
}intmain() {
#ifdef DEBUG
freopen(".in","r",stdin);
freopen(".out","w",stdout);#endifinit();
work();return 0;
}
View Code
9.二分图匹配 km算法
//Twenty
#include#include#include#include#include#include#include#include#include
#define INF 0xfffffff
const int maxn=305;
typedeflong longLL;using namespacestd;intn,cx[maxn],cy[maxn],x[maxn],y[maxn],pr[maxn],slack[maxn];inta[maxn][maxn];int find(intu) {
x[u]=1;for(int i=1;i<=n;i++) if(!y[i]){if(cx[u]+cy[i]==a[u][i]) {
y[i]=1;if(pr[i]==-1||find(pr[i])) {
pr[i]=u;return 1;
}
}else slack[i]=min(slack[i],-a[u][i]+cx[u]+cy[i]);
}return 0;
}voidwork() {
memset(pr,-1,sizeof(pr));
memset(cy,0,sizeof(cy));for(int i=1;i<=n;i++) {for(int j=1;j<=n;j++) slack[j]=INF;for(;;) {
memset(x,0,sizeof(x));
memset(y,0,sizeof(y));if(find(i)) break;int d=INF;for(int j=1;j<=n;j++)if(!y[j]&&d>slack[j])
d=slack[j];if(d==INF) return;for(int j=1;j<=n;j++) {if(x[j]) cx[j]-=d;if(y[j]) cy[j]+=d;else slack[j]-=d;
}
}
}int ans=0;for(int i=1;i<=n;i++)
ans+=a[pr[i]][i];
printf("%d\n",ans);
}voidinit() {while(~scanf("%d",&n)) {for(int i=1;i<=n;i++) {
cx[i]=-INF;for(int j=1;j<=n;j++) {
scanf("%d",&a[i][j]);
cx[i]=max(cx[i],a[i][j]);
}
}
work();
}
}intmain() {
init();return 0;
}
View Code
10.线性基
//Twenty
#include#include#include#include#include#include#include#include#include
const int maxn=101;
typedeflong longLL;using namespacestd;intn;
LL a[maxn],b[maxn];
template void read(T &x) {char ch=getchar(); T f=1; x=0;while(ch!='-'&&(ch'9')) ch=getchar();if(ch=='-') f=-1,ch=getchar();for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0'; x*=f;
}voidwork() {for(int i=1;i<=n;i++)for(int j=60;j>=0;j--)if((1LL<
}
LL ans=0;for(int i=60;i>=0;i--)if((ans^b[i])>ans) ans^=b[i];
printf("%lld\n",ans);
}voidinit() {
read(n);for(int i=1;i<=n;i++) read(a[i]);
}intmain() {
#ifdef DEBUG
freopen(".in","r",stdin);
freopen(".out","w",stdout);#endifinit();
work();return 0;
}
View Code
11.高斯消元
//Twenty
#include#include#include#include#include#include#include#include#include
const int maxn=105;
typedeflong longLL;using namespacestd;intn;doublea[maxn][maxn];
template void read(T &x) {char ch=getchar(); T f=1; x=0;while(ch!='-'&&(ch'9')) ch=getchar();if(ch=='-') f=-1,ch=getchar();for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0'; x*=f;
}int gauss(double a[][105],intn) {for(int i=1;i<=n;i++) {int now=i;for(int j=i+1;j<=n;j++)if(a[j][i]>a[now][i]) now=j;if(now!=i)for(int j=i;j<=n+1;j++)
swap(a[i][j],a[now][j]);if(a[now][i]==0) return 0;for(int j=i+1;j<=n+1;j++)
a[i][j]/=a[i][i];
a[i][i]=1;for(int j=i+1;j<=n;j++) {for(int k=i+1;k<=n+1;k++)
a[j][k]-=a[i][k]*a[j][i];
a[j][i]=0;
}
}for(int i=n-1;i>=1;i--)for(int j=i+1;j<=n;j++)
a[i][n+1]-=a[i][j]*a[j][n+1];return 1;
}voidwork()
{if(!gauss(a,n)) printf("No Solution\n");else
for(int i=1;i<=n;i++)
printf("%.2lf\n",a[i][n+1]);
}voidinit() {
read(n);for(int i=1;i<=n;i++)for(int j=1;j<=n+1;j++)
read(a[i][j]);
}intmain() {
#ifdef DEBUG
freopen(".in","r",stdin);
freopen(".out","w",stdout);#endifinit();
work();return 0;
}
View Code
12.tarjan割点
//Twenty
#include#include#include#include#include#include#include#include#include
const int maxn=100005;
typedeflong longLL;using namespacestd;intn,m,ans[maxn];
template void read(T &x) {char ch=getchar(); T f=1; x=0;while(ch!='-'&&(ch'9')) ch=getchar();if(ch=='-') f=-1,ch=getchar();for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0'; x*=f;
}int ecnt,fir[maxn],nxt[maxn<<1],to[maxn<<1];void add(int u,intv) {
nxt[++ecnt]=fir[u]; fir[u]=ecnt; to[ecnt]=v;
nxt[++ecnt]=fir[v]; fir[v]=ecnt; to[ecnt]=u;
}intrc,dfs_clock,dfn[maxn],low[maxn],cut[maxn];void tarjan(int x,intrt) {
dfn[x]=low[x]=++dfs_clock;for(int i=fir[x];i;i=nxt[i]) {if(!dfn[to[i]]) {if(x==rt) rc++;
tarjan(to[i],rt);
low[x]=min(low[x],low[to[i]]);if(x!=rt&&low[to[i]]>=dfn[x]) cut[x]=1;
}else low[x]=min(low[x],dfn[to[i]]);
}if(x==rt&&rc>=2) cut[x]=1;
}voidwork() {for(int i=1;i<=n;i++)if(!dfn[i]) {rc=0;tarjan(i,i);}for(int i=1;i<=n;i++)if(cut[i])
ans[++ans[0]]=i;
printf("%d\n",ans[0]);for(int i=1;i
}voidinit() {
read(n);
read(m);for(int i=1;i<=m;i++) {intx,y;
read(x); read(y);
add(x,y);
}
}intmain() {
init();
work();return 0;
}
View Code
13.tarjan求桥
#include#include#include#include#include#include#includetypedeflong longLL;using namespacestd;const int maxn=10000+299;const int maxm=100000*2+299;intT,n,m,x,y,fir[maxn],nxt[maxm],to[maxm],fa[maxn],cc,cut[maxm],dfn[maxn],id[maxm],low[maxn],dfs_clock,ecnt;void add(int x,int y,inttot) {
nxt[++ecnt]=fir[x]; fir[x]=ecnt; to[ecnt]=y; id[ecnt]=tot;
nxt[++ecnt]=fir[y]; fir[y]=ecnt; to[ecnt]=x; id[ecnt]=tot;
}voidclear() {
memset(fir,0,sizeof(fir));
memset(dfn,0,sizeof(dfn));
memset(low,0,sizeof(low));
memset(cut,0,sizeof(cut));
memset(fa,0,sizeof(fa)); ecnt=0;
dfs_clock=0;
}void tarjan(intx) {
dfn[x]=low[x]=++dfs_clock;for(int i=fir[x];i;i=nxt[i]) {if(!dfn[to[i]]) {
fa[to[i]]=i;
tarjan(to[i]);
low[x]=min(low[x],low[to[i]]);
}else if(id[fa[x]]!=id[i]) low[x]=min(low[x],dfn[to[i]]);
}if(fa[x]&&dfn[x]==low[x]) {
cc++;
cut[id[fa[x]]]=1;
}
}intmain()
{
scanf("%d",&T);while(T) {
clear();
scanf("%d%d",&n,&m);for(int i=1;i<=m;i++) {
scanf("%d%d",&x,&y);
add(x,y,i);
}for(int i=1;i<=n;i++)if(!dfn[i]) tarjan(i);
printf("%d\n",cc);for(int i=1;i<=m;i++)if(cut[i]) { cc--; if(cc) printf("%d",i); else printf("%d\n",i);}--T;if(T) printf("\n");
}return 0;
}
View Code
14.网络最大流
//Twenty
#include#include#include#include#include#include#include#include#include
#define inf 0xfffffff
const int N=10007;const int M=100007;
typedeflong longLL;using namespacestd;int n,m,s,t,d[N],c[N],ecnt=1;
template void read(T &x) {char ch=getchar(); T f=1; x=0;while(ch!='-'&&(ch'9')) ch=getchar();if(ch=='-') f=-1,ch=getchar();for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0'; x*=f;
}structedge {int from,to,cap,flow,nxt;
edge(){}
edge(int from,int to,int cap,int flow,int nxt):from(from),to(to),cap(cap),flow(flow),nxt(nxt){}
}e[M<<1];intfir[N],cur[N];void add(int u,int v,intw) {
e[++ecnt]=edge(u,v,w,0,fir[u]);
e[++ecnt]=edge(v,u,0,0,fir[v]);
fir[u]=ecnt-1; fir[v]=ecnt;
}
queueque;voidbfs() {for(int i=1;i<=n;i++) d[i]=n;
d[t]=0;
que.push(t);while(!que.empty()) {int x=que.front();
que.pop();for(int i=fir[x];i;i=e[i].nxt) {int y=e[i].to;if(d[y]==n&&e[i].cap==e[i].flow) {
d[y]=d[x]+1;
que.push(y);
}
}
}
}intp[N];intcal() {int fl=inf;for(int x=t;x!=s;x=e[p[x]].from)
fl=min(fl,e[p[x]].cap-e[p[x]].flow);for(int x=t;x!=s;x=e[p[x]].from) {
e[p[x]].flow+=fl;
e[p[x]^1].flow-=fl;
}returnfl;
}intmax_flow() {
bfs();for(int i=1;i<=n;i++) cur[i]=fir[i],c[d[i]]++;int res=0;for(int x=s;d[x]
res+=cal();
x=s;
}int ok=0;for(int &i=cur[x];i;i=e[i].nxt) {int y=e[i].to;if(d[y]+1==d[x]&&e[i].cap>e[i].flow) {
ok=1;
p[y]=i;
x=y;break;
}
}if(!ok) {
cur[x]=fir[x];int M=n;for(int i=cur[x];i;i=e[i].nxt) {int y=e[i].to;if(e[i].flow
}if(!(--c[d[x]])) break;
c[d[x]=M]++;if(x!=s) x=e[p[x]].from;
}
}returnres;
}voidwork() {
printf("%d\n",max_flow());
}voidinit() {
read(n);
read(m);
read(s);
read(t);for(int i=1;i<=m;i++) {intu,v,w;
read(u);
read(v);
read(w);
add(u,v,w);
}
}intmain() {
#ifdef DEBUG
freopen(".in","r",stdin);
freopen(".out","w",stdout);#endifinit();
work();return 0;
}
View Code
15.最小费用最大流
//Twenty
#include#include#include#include#include#include#include#include#include
#define inf 0xfffffff
const int N=5007;const int M=50007;
typedeflong longLL;using namespacestd;int n,m,s,t,ecnt=1;
template void read(T &x) {char ch=getchar(); T f=1; x=0;while(ch!='-'&&(ch'9')) ch=getchar();if(ch=='-') f=-1,ch=getchar();for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0'; x*=f;
}structedge {int from,to,cap,flow,cost,nxt;
edge(){}
edge(int from,int to,int cap,int flow,int cost,int nxt):from(from),to(to),cap(cap),flow(flow),cost(cost),nxt(nxt){}
}e[M<<1];intfir[N],cur[N];void add(int u,int v,int w,intc) {
e[++ecnt]=edge(u,v,w,0,c,fir[u]);
e[++ecnt]=edge(v,u,0,0,-c,fir[v]);
fir[u]=ecnt-1; fir[v]=ecnt;
}intp[N];intcal() {int fl=inf;for(int x=t;x!=s;x=e[p[x]].from)
fl=min(fl,e[p[x]].cap-e[p[x]].flow);for(int x=t;x!=s;x=e[p[x]].from) {
e[p[x]].flow+=fl;
e[p[x]^1].flow-=fl;
}returnfl;
}
queueque;intdis[N],vis[N];intspfa() {for(int i=1;i<=n;i++) dis[i]=inf;
dis[s]=0; vis[s]=1; que.push(s);while(!que.empty()) {int x=que.front();
que.pop(); vis[x]=0;for(int i=fir[x];i;i=e[i].nxt) {int y=e[i].to;if(e[i].cap>e[i].flow&&dis[y]>dis[x]+e[i].cost) {
p[y]=i;
dis[y]=dis[x]+e[i].cost;if(!vis[y]) {
vis[y]=1;
que.push(y);
}
}
}
}return (dis[t]!=inf);
}int ans2=0;intmax_flow() {int res=0;while(spfa()) {int tp=cal();
res+=tp;
ans2+=tp*dis[t];
}returnres;
}voidwork() {
printf("%d",max_flow());
printf("%d\n",ans2);
}voidinit() {
read(n);
read(m);
read(s);
read(t);for(int i=1;i<=m;i++) {intu,v,w,c;
read(u);
read(v);
read(w);
read(c);
add(u,v,w,c);
}
}intmain() {
#ifdef DEBUG
freopen(".in","r",stdin);
freopen(".out","w",stdout);#endifinit();
work();return 0;
}
View Code
16.倍增求lca
//Twenty
#include#include#include#include#include#include#include#include#include
const int maxn=500007;
typedeflong longLL;using namespacestd;intn,m,rt;
template void read(T &x) {char ch=getchar(); T f=1; x=0;while(ch!='-'&&(ch'9')) ch=getchar();if(ch=='-') f=-1,ch=getchar();for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0'; x*=f;
}int ecnt,fir[maxn],nxt[maxn<<1],to[maxn<<1];void add(int u,intv) {
nxt[++ecnt]=fir[u]; fir[u]=ecnt; to[ecnt]=v;
nxt[++ecnt]=fir[v]; fir[v]=ecnt; to[ecnt]=u;
}int f[maxn][20],R[maxn];void dfs(int x,intfa) {
f[x][0]=fa; R[x]=R[fa]+1;for(int i=1;i<=19;i++)
f[x][i]=f[f[x][i-1]][i-1];for(int i=fir[x];i;i=nxt[i]) if(to[i]!=fa) {
dfs(to[i],x);
}
}int get_lca(int x,inty) {if(R[x]=0;i--)if(f[x][i]&&R[f[x][i]]>=R[y])
x=f[x][i];if(x==y) returnx;for(int i=19;i>=0;i--)if(f[x][i]&&f[x][i]!=f[y][i])
x=f[x][i],y=f[y][i];return f[x][0];
}voidwork() {
dfs(rt,0);for(int i=1;i<=m;i++) {intx,y;
read(x); read(y);
printf("%d\n",get_lca(x,y));
}
}voidinit() {
read(n);
read(m);
read(rt);for(int i=1;i
read(u); read(v);
add(u,v);
}
}intmain() {
#ifdef DEBUG
freopen(".in","r",stdin);
freopen(".out","w",stdout);#endifinit();
work();return 0;
}
View Code
17.tarjan求lca
//Twenty
#include#include#include#include#include#include#include#include#include
const int maxn=500007;
typedeflong longLL;using namespacestd;intn,m,rt;
template void read(T &x) {char ch=getchar(); T f=1; x=0;while(ch!='-'&&(ch'9')) ch=getchar();if(ch=='-') f=-1,ch=getchar();for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0'; x*=f;
}int ecnt,fir[maxn],nxt[maxn<<1],to[maxn<<1];void add(int u,intv) {
nxt[++ecnt]=fir[u]; fir[u]=ecnt; to[ecnt]=v;
nxt[++ecnt]=fir[v]; fir[v]=ecnt; to[ecnt]=u;
}int cnt,fi[maxn],nx[maxn<<1],tt[maxn<<1],id[maxn<<1],ans[maxn];void add_ask(int u,int v,inti) {
nx[++cnt]=fi[u]; fi[u]=cnt; tt[cnt]=v; id[cnt]=i;
nx[++cnt]=fi[v]; fi[v]=cnt; tt[cnt]=u; id[cnt]=i;
}intfa[maxn],vis[maxn];int find(int x) { return x==fa[x]?x:fa[x]=find(fa[x]);}void dfs(int x,intf) {for(int i=fi[x];i;i=nx[i])if(vis[tt[i]])
ans[id[i]]=find(tt[i]);
vis[x]=1;for(int i=fir[x];i;i=nxt[i]) if(to[i]!=f)
dfs(to[i],x);
fa[x]=f;
}voidwork() {for(int i=1;i<=n;i++) fa[i]=i;for(int i=1;i<=m;i++) {intx,y;
read(x); read(y);
add_ask(x,y,i);
}
dfs(rt,0);for(int i=1;i<=m;i++)
printf("%d\n",ans[i]);
}voidinit() {
read(n);
read(m);
read(rt);for(int i=1;i
read(u); read(v);
add(u,v);
}
}intmain() {
#ifdef DEBUG
freopen(".in","r",stdin);
freopen(".out","w",stdout);#endifinit();
work();return 0;
}
View Code
18.树剖求lca
//Twenty
#include#include#include#include#include#include#include#include#include
const int maxn=500007;
typedeflong longLL;using namespacestd;intn,m,rt;
template void read(T &x) {char ch=getchar(); T f=1; x=0;while(ch!='-'&&(ch'9')) ch=getchar();if(ch=='-') f=-1,ch=getchar();for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0'; x*=f;
}int ecnt,fir[maxn],nxt[maxn<<1],to[maxn<<1];void add(int u,intv) {
nxt[++ecnt]=fir[u]; fir[u]=ecnt; to[ecnt]=v;
nxt[++ecnt]=fir[v]; fir[v]=ecnt; to[ecnt]=u;
}intR[maxn],sz[maxn],top[maxn],fa[maxn];void dfs(int x,intf) {
R[x]=R[f]+1;
sz[x]=1; fa[x]=f;for(int i=fir[x];i;i=nxt[i]) if(to[i]!=f) {
dfs(to[i],x);
sz[x]+=sz[to[i]];
}
}void DFS(int x,inttt) {
top[x]=tt;int mson=0;for(int i=fir[x];i;i=nxt[i]) if(to[i]!=fa[x]&&sz[to[i]]>sz[mson]){
mson=to[i];
}if(!mson) return;
DFS(mson,tt);for(int i=fir[x];i;i=nxt[i]) if(to[i]!=fa[x]&&to[i]!=mson){
DFS(to[i],to[i]);
}
}int get_lca(int x,inty) {while(top[x]!=top[y]) {if(R[top[x]]
x=fa[top[x]];
}if(R[x]>R[y]) swap(x,y);returnx;
}voidwork() {
dfs(rt,0);
DFS(rt,rt);for(int i=1;i<=m;i++) {intx,y;
read(x); read(y);
printf("%d\n",get_lca(x,y));
}
}voidinit() {
read(n);
read(m);
read(rt);for(int i=1;i
read(u); read(v);
add(u,v);
}
}intmain() {
#ifdef DEBUG
freopen(".in","r",stdin);
freopen(".out","w",stdout);#endifinit();
work();return 0;
}
View Code
19.manacher
//Twenty
#include#include#include#include#include#include#include#include#include
const int maxn=11000007;
typedeflong longLL;using namespacestd;int tot,ans,rad[maxn<<1];char a[maxn<<1];
template void read(T &x) {char ch=getchar(); T f=1; x=0;while(ch!='-'&&(ch'9')) ch=getchar();if(ch=='-') f=-1,ch=getchar();for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0'; x*=f;
}voidmanacher() {for(int i=0,j=0,k;i
rad[i]=j;
ans=max(ans,j);for(k=1;k<=j&&rad[i-k]!=rad[i]-k;k++)
rad[i+k]=min(rad[i-k],rad[i]-k);
i+=k;
j=max(j-k,0);
}
}voidinit() {
a[tot++]='&';
a[tot++]='#';char ch=getchar();while(ch'z') ch=getchar();for(;ch>='a'&&ch<='z';ch=getchar()) {
a[tot++]=ch;
a[tot++]='#';
}
a[tot++]='*';
manacher();
printf("%d\n",ans);
}intmain() {
#ifdef DEBUG
freopen(".in","r",stdin);
freopen(".out","w",stdout);#endifinit();return 0;
}
View Code
20.AC自动机
//Twenty
#include#include#include#include#include#include#include#include#includetypedeflong longLL;using namespacestd;const int maxn=1e6+7;int ch[maxn][26],w[maxn],fail[maxn],tot,rt,n,ans;chara[maxn];
template void read(T &x) {char ch=getchar(); T f=1; x=0;while(ch!='-'&&(ch'9')) ch=getchar();if(ch=='-') f=-1,ch=getchar();for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0'; x*=f;
}voidinsert() {int now=rt;for(int i=0;a[i]!='\0';i++) {int c=a[i]-'a';if(!ch[now][c]) ch[now][c]=++tot;
now=ch[now][c];
}
w[now]++;
}
queueque;voidget_fail() {
que.push(rt);while(!que.empty()) {int x=que.front();
que.pop();for(int i=0;i<26;i++) if(ch[x][i]){int y=ch[x][i];if(x==rt) fail[y]=rt;else{int tp=fail[x];while(fail[tp]&&!ch[tp][i]) tp=fail[tp];if(ch[tp][i]) fail[y]=ch[tp][i]; else fail[y]=rt;
}
que.push(y);
}
}
}voidqry() {int now=rt;for(int i=0;a[i]!='\0';i++) {int c=a[i]-'a';while(!ch[now][c]&&fail[now]) now=fail[now];if(ch[now][c]) {
now=ch[now][c];
ans+=w[now];
w[now]=0;int tp=fail[now];while(tp&&w[tp]) {
ans+=w[tp];
w[tp]=0;
tp=fail[tp];
}
}
}
}intmain() {
#ifdef DEBUG
freopen(".in","r",stdin);
freopen(".out","w",stdout);#endifread(n);for(int i=1;i<=n;i++) {
scanf("%s",a);
insert();
}
get_fail();
scanf("%s",a);
qry();
printf("%d\n",ans);return 0;
}
View Code
21.lucas定理
//Twenty
#include#include#include#include#include#include#include#include#include
const int maxn=1e5+7;
typedeflong longLL;using namespacestd;intT,p;
LL n,m,power[maxn];
template void read(T &x) {char ch=getchar(); T f=1; x=0;while(ch!='-'&&(ch'9')) ch=getchar();if(ch=='-') f=-1,ch=getchar();for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0'; x*=f;
}
LL ksm(LL a,LL b,intp) {
LLbase=a,res=1;while(b) {if(b&1) (res*=base)%=p;
(base*=base)%=p;
b>>=1;
}returnres;
}
LL cal(LL n,LL m,intp) {if(m>n) return 0;return power[n]*ksm(power[m]*power[n-m]%p,p-2,p)%p;
}
LL lucas(LL n,LL m,intp) {if(!m) return 1;return cal(n%p,m%p,p)*lucas(n/p,m/p,p)%p;
}voidinit() {
read(T);while(T--) {
read(n);
read(m);
read(p);
power[0]=1;for(int i=1;i<=p;i++) power[i]=power[i-1]*i%p;
printf("%lld\n",lucas(n+m,m,p));
}
}intmain() {
#ifdef DEBUG
freopen(".in","r",stdin);
freopen(".out","w",stdout);#endifinit();return 0;
}
View Code