为什么用 scanf 读入字符串会导致全 WA?代码如下:
#include <bits/stdc++.h>
using namespace std;
const int N = 1e7 + 8;
#define ls(x) tr[tr[x].l]
#define rs(x) tr[tr[x].r]
int n;
int root[N], cur;
int idx;
struct Node
{
int l, r;
char c;
int siz;
}tr[N << 1];
void pushup(int u)
{
tr[u].siz = ls(u).siz + rs(u).siz;
}
void insert(int &u, int p, int l, int r, char v)
{
u = ++idx;
tr[u] = tr[p];
if(l == r)
{
tr[u].c = v;
tr[u].siz = 1;
return;
}
int mid = (l + r) >> 1;
if(ls(u).siz == (mid - l + 1)) insert(tr[u].r, tr[p].r, mid + 1, r, v);
else insert(tr[u].l, tr[p].l, l, mid, v);
pushup(u);
}
char query(int u, int l, int r, int x)
{
if(!u) return '\0';
if(l == r) return tr[u].c;
int mid = (l + r) >> 1;
if(x <= ls(u).siz) return query(tr[u].l, l, mid, x);
return query(tr[u].r, mid + 1, r, x - ls(u).siz);
}
int main()
{
scanf("%d", &n);
int t = n;
while(t--)
{
char op[3], ch[3];
scanf("%s %s", op, ch);
int x = ch[0] - '0';
switch(op[0])
{
case 'T':
++cur;
insert(root[cur], root[cur - 1], 1, n, ch[0]);
break;
case 'U':
++cur;
root[cur] = root[cur - 1 - x];
break;
case 'Q':
printf("%c\n", query(root[cur], 1, n, x));
break;
}
}
return 0;
}
但是,把输入改成 cin 就可以过了:
#include <bits/stdc++.h>
using namespace std;
const int N = 1e7 + 8;
#define ls(x) tr[tr[x].l]
#define rs(x) tr[tr[x].r]
int n;
int root[N], cur;
int idx;
struct Node
{
int l, r;
char c;
int siz;
}tr[N << 1];
void pushup(int u)
{
tr[u].siz = ls(u).siz + rs(u).siz;
}
void insert(int &u, int p, int l, int r, char v)
{
u = ++idx;
tr[u] = tr[p];
if(l == r)
{
tr[u].c = v;
tr[u].siz = 1;
return;
}
int mid = (l + r) >> 1;
if(ls(u).siz == (mid - l + 1)) insert(tr[u].r, tr[p].r, mid + 1, r, v);
else insert(tr[u].l, tr[p].l, l, mid, v);
pushup(u);
}
char query(int u, int l, int r, int x)
{
if(!u) return '\0';
if(l == r) return tr[u].c;
int mid = (l + r) >> 1;
if(x <= ls(u).siz) return query(tr[u].l, l, mid, x);
return query(tr[u].r, mid + 1, r, x - ls(u).siz);
}
int main()
{
scanf("%d", &n);
int t = n;
while(t--)
{
char op, c;
int x;
cin >> op;
switch(op)
{
case 'T':
cin >> c;
++cur;
insert(root[cur], root[cur - 1], 1, n, c);
break;
case 'U':
cin >> x;
++cur;
root[cur] = root[cur - 1 - x];
break;
case 'Q':
cin >> x;
printf("%c\n", query(root[cur], 1, n, x));
break;
}
}
return 0;
}