这章刷的真带劲 嘿嘿
裸题
#include<cstdio> #include<iostream> #include<cstring> #include<cstdlib> #include<algorithm> #include<cmath> using namespace std; struct Trie { int c,w[30]; Trie(){c=0;memset(w,0,sizeof(w));} }tr[1100000];int trlen; char ss[1100000]; void maketree() { int now=0,len=strlen(ss+1); for(int i=1;i<=len;i++) { int x=ss[i]-‘a‘+1; if(tr[now].w[x]==0) tr[now].w[x]=++trlen; now=tr[now].w[x]; } tr[now].c++; } int getsum() { int now=0,sum=0,len=strlen(ss+1); for(int i=1;i<=len;i++) { int x=ss[i]-‘a‘+1; if(tr[now].w[x]==0)return sum; now=tr[now].w[x]; sum+=tr[now].c; } return sum; } int main() { int n,Q; scanf("%d%d",&n,&Q); trlen=0; for(int i=1;i<=n;i++) scanf("%s",ss+1), maketree(); while(Q--) { scanf("%s",ss+1); printf("%d\n",getsum()); } return 0; }
前缀统计
字典树算最大异或和的老套路
#include<cstdio> #include<iostream> #include<cstring> #include<cstdlib> #include<algorithm> #include<cmath> using namespace std; struct Trie { int c,w[2]; Trie(){c=0;memset(w,0,sizeof(w));} }tr[3100000];int trlen; int D; int mmax; void ask() { int now=0,sum=0; for(int i=1;i<=31;i++) { int x= ( D&(1<<(31-i)) ) ? 0:1; if(tr[now].w[x]!=0) { sum+=(1<<(31-i)); now=tr[now].w[x]; } else now=tr[now].w[x^1]; } mmax=max(mmax,sum); } void insert() { int now=0; for(int i=1;i<=31;i++) { int x= ( D&(1<<(31-i)) ) ? 1:0; if(tr[now].w[x]==0) tr[now].w[x]=++trlen; now=tr[now].w[x]; } } int main() { int n;mmax=0; scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",&D); if(i!=1)ask(); insert(); } printf("%d\n",mmax); return 0; }
The XOR Largest Pair
同上,变形一下就行了,注意字典树的清空啊!!
#include<cstdio> #include<iostream> #include<cstring> #include<cstdlib> #include<algorithm> #include<cmath> using namespace std; struct Trie { int w[2]; }tr[6100000];int trlen; int D,mmax,c[210000]; void ask() { int now=0,sum=0; for(int i=1;i<=31;i++) { int x= ( D&(1<<(31-i)) ) ? 0:1; if(tr[now].w[x]!=0) { sum+=(1<<(31-i)); now=tr[now].w[x]; } else now=tr[now].w[x^1]; } mmax=max(mmax,sum); } void insert() { int now=0; for(int i=1;i<=31;i++) { int x= ( D&(1<<(31-i)) ) ? 1:0; if(tr[now].w[x]==0) tr[now].w[x]=++trlen, tr[trlen].w[0]=tr[trlen].w[1]=0; now=tr[now].w[x]; } } struct node { int x,y,d,next; }a[410000];int len,last[210000]; void ins(int x,int y,int d) { len++; a[len].x=x;a[len].y=y;a[len].d=d; a[len].next=last[x];last[x]=len; } void dfs(int x,int F) { for(int k=last[x];k;k=a[k].next) { int y=a[k].y; if(y!=F) { c[y]=c[x]^a[k].d; dfs(y,x); } } } int main() { int n; while(scanf("%d",&n)!=EOF) { len=0;memset(last,0,sizeof(last)); for(int i=1;i<n;i++) { int x,y,d; scanf("%d%d%d",&x,&y,&d);x++,y++; ins(x,y,d);ins(y,x,d); } c[1]=0;dfs(1,0); mmax=0;trlen=0;tr[0].w[0]=tr[0].w[1]=0; for(int i=1;i<=n;i++) { D=c[i]; if(i!=1)ask(); insert(); } printf("%d\n",mmax); } return 0; }
poj3764
原文地址:https://www.cnblogs.com/AKCqhzdy/p/9255616.html
时间: 2024-10-22 05:37:42