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 点赞 评论 收藏
分享
关注他的用户也关注了: