爱奇艺算法岗笔试爆炸。。。

两道编程题怎么破#爱奇艺#
全部评论
第一题 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; }
点赞 回复 分享
发布于 2019-09-18 21:24
第一题kmp记录在那些位置上匹配成功,然后求个前缀和就是答案了。第二题用线段树,向上更新交替用OR和XOR运算,根结点的值就是答案
点赞 回复 分享
发布于 2019-09-18 21:01
好难 第二道题目都没看明白
点赞 回复 分享
发布于 2019-09-18 20:39
我已经提前交卷了,第二题超时,第一题就没明白咋做
点赞 回复 分享
发布于 2019-09-18 20:40
我也是
点赞 回复 分享
发布于 2019-09-18 20:44

相关推荐

点赞 5 评论
分享
牛客网
牛客企业服务