魏无忌 level
获赞
7
粉丝
3
关注
53
看过 TA
6
门头沟学院
2020
C++
IP属地:广东
暂未填写个人简介
私信
关注
2019-09-18 21:45
已编辑
门头沟学院 C++
两道编程题怎么破
Jonariguez:第一题 kmp(看别人貌似暴力也能过) char T[maxn]; char P[maxn]; int f[maxn],cnt[maxn]; void getf(char *P,int* f){     int n=strlen(P);     f[0]=f[1]=0;     for(int i=1;i<n;i++){         int j=f[i];         while(j && P[i]!=P[j])             j=f[j];         f[i+1]=P[i]==P[j]?j+1:0;     } } int main() {     int i,j,n,m;     scanf("%s",T);     scanf("%s",P);     getf(P,f);     n=strlen(T);     m=strlen(P);     j=0;     for(i=0;i<n;i++){         while(j && P[j]!=T[i]) j=f[j];         if(P[j]==T[i])             j++;         if(j==m){              cnt[i]++;//在主串的第i个位置匹配成功             j=f[j];         }     }     printf("%d",cnt[0]);     for(i=1;i<n;i++){         cnt[i]+=cnt[i-1];         printf(" %d",cnt[i]);     }     return 0; } 第二题 线段树 int sum[maxn*4],a[maxn],n,N; void pushupOR(int k){     sum[k]=(sum[k*2]|sum[k*2+1]); } void pushupXOR(int k){     sum[k]=(sum[k*2]^sum[k*2+1]); } void build(int k,int l,int r,int d){     if(l==r){         sum[k]=a[l];return ;     }     int m=(l+r)/2;     build(k*2,l,m,d+1);     build(k*2+1,m+1,r,d+1);     if((n-d)&1)         pushupXOR(k);     else         pushupOR(k); } void update(int p,int v,int k,int l,int r,int d){     if(l==r){         sum[k]=v;         return ;     }     int m=(l+r)/2;     if(p<=m)         update(p,v,k*2,l,m,d+1);     else         update(p,v,k*2+1,m+1,r,d+1);     if((n-d)&1)         pushupXOR(k);     else         pushupOR(k); } int main() {     int i,j,m;     scanf("%d%d",&n,&m);     N=(1<<n);     for(i=1;i<=N;i++)         scanf("%d",&a[i]);     build(1,1,N,1);     while(m--){         int u,v;         scanf("%d%d",&u,&v);         update(u,v,1,1,N,1);         printf("%d\n",sum[1]);     }     return 0; }
投递爱奇艺等公司10个岗位 >
0 点赞 评论 收藏
分享
关注他的用户也关注了:
牛客网
牛客企业服务