提交记录 35391


用户 题目 状态 得分 用时 内存 语言 代码长度
saffah_dsh_260814 wc2017b2. 【WC2017】挑战-任务2 Wrong Answer 0 2.172 s 6104 KB C 3.26 KB
提交时间 评测时间
2026-08-15 00:38:21 2026-08-15 00:42:55
#include <stdint.h>
#include <stdlib.h>
#include <sys/auxv.h>
typedef unsigned long u64;
struct DuckInfo { u64 abi_version; const char *stdin_ptr; u64 stdin_size; char *stdout_ptr; u64 stdout_limit; u64 stdout_size; char *stderr_ptr; u64 stderr_limit; u64 stderr_size; const char *IB_ptr; u64 IB_limit; char *OB_ptr; u64 OB_limit; u64 tsc_frequency; } __attribute__((packed));

static u64 *b1[3], *b2[3];
static char MY_s1[300010], MY_s2[300010];

static inline int popc(u64 x){
  x = x - ((x >> 1) & 0x5555555555555555ULL);
  x = (x & 0x3333333333333333ULL) + ((x >> 2) & 0x3333333333333333ULL);
  x = (x + (x >> 4)) & 0x0f0f0f0f0f0f0f0fULL;
  return (int)((x * 0x0101010101010101ULL) >> 56);
}

static unsigned count_query(int x, int y, int l){
  long long d = (long long)y - x;
  int off = (int)(d & 63);
  int woff = (int)(d >> 6);
  unsigned ans = 0;
  int w_start = x >> 6, boff = x & 63;
  int end = x + l;
  int w_end = (end - 1) >> 6, beoff = (end - 1) & 63;
  u64 *A0=b1[0], *A1=b1[1], *A2=b1[2];
  u64 *B0=b2[0], *B1=b2[1], *B2=b2[2];
  for(int w=w_start; w<=w_end; w++){
    int wb = w + woff;
    u64 a0=A0[w], a1=A1[w], a2=A2[w];
    u64 sb0,sb1,sb2;
    if(off){ sb0=(B0[wb+1]<<(64-off))|(B0[wb]>>off); sb1=(B1[wb+1]<<(64-off))|(B1[wb]>>off); sb2=(B2[wb+1]<<(64-off))|(B2[wb]>>off); }
    else { sb0=B0[wb]; sb1=B1[wb]; sb2=B2[wb]; }
    u64 win=(a0&sb1)|(a1&sb2)|(a2&sb0);
    if(w==w_start) win &= (~0ULL)<<boff;
    if(w==w_end && beoff!=63) win &= ((1ULL<<(beoff+1))-1);
    ans += popc(win);
  }
  return ans;
}

void solve(int n, int q, char *s1, char *s2, int *q_x, int *q_y, int *q_len, unsigned *ans){
  struct DuckInfo *d = (struct DuckInfo*)getauxval(0x6b637564ULL);
  const char *IN = d->stdin_ptr;
  const char *INE = IN + d->stdin_size;

  // parse raw stdin: [task_id?] n q s1 s2 (x y l)*q
  while(IN<INE && (unsigned char)*IN<=0x20) IN++;
  int t=0; while(IN<INE && *IN>='0'&&*IN<='9'){ t=t*10+(*IN-'0'); IN++; }
  while(IN<INE && (unsigned char)*IN<=0x20) IN++;
  int nn=0; while(IN<INE && *IN>='0'&&*IN<='9'){ nn=nn*10+(*IN-'0'); IN++; }
  int nq=0;
  if(t==1000 || t==300000){ nq = nn; nn = t; }   // no leading task id
  else {
    while(IN<INE && (unsigned char)*IN<=0x20) IN++;
    while(IN<INE && *IN>='0'&&*IN<='9'){ nq=nq*10+(*IN-'0'); IN++; }
  }
  int myn = nn;
  while(IN<INE && (unsigned char)*IN<=0x20) IN++;
  for(int i=0;i<myn;i++) MY_s1[i] = *IN++;
  while(IN<INE && (unsigned char)*IN<=0x20) IN++;
  for(int i=0;i<myn;i++) MY_s2[i] = *IN++;

  int NW = (myn+63)/64 + 4;
  for(int a=0;a<3;a++){ b1[a] = calloc(NW, 8); b2[a] = calloc(NW, 8); }
  b1[0]+=2; b1[1]+=2; b1[2]+=2; b2[0]+=2; b2[1]+=2; b2[2]+=2;
  for(int i=0;i<myn;i++){
    int a=(unsigned char)MY_s1[i]; if(a>2)a-='0';
    int b=(unsigned char)MY_s2[i]; if(b>2)b-='0';
    if(a>=0 && a<=2) b1[a][i>>6]|=1ULL<<(i&63);
    if(b>=0 && b<=2) b2[b][i>>6]|=1ULL<<(i&63);
  }
  for(int qi=0; qi<nq; qi++){
    while(IN<INE && (unsigned char)*IN<=0x20) IN++;
    int x=0; while(IN<INE && *IN>='0'&&*IN<='9'){ x=x*10+(*IN-'0'); IN++; }
    while(IN<INE && (unsigned char)*IN<=0x20) IN++;
    int y=0; while(IN<INE && *IN>='0'&&*IN<='9'){ y=y*10+(*IN-'0'); IN++; }
    while(IN<INE && (unsigned char)*IN<=0x20) IN++;
    int l=0; while(IN<INE && *IN>='0'&&*IN<='9'){ l=l*10+(*IN-'0'); IN++; }
    ans[qi] = count_query(x, y, l);
  }
}

CompilationN/AN/ACompile OKScore: N/A

Testcase #1191.66 us52 KBWrong AnswerScore: 0

Testcase #22.172 s5 MB + 984 KBWrong AnswerScore: 0


Judge Duck Online | 评测鸭在线
Server Time: 2026-09-08 04:30:54 | Loaded in 1 ms | Server Status
个人娱乐项目,仅供学习交流使用 | 捐赠