读入问题
查看原帖
读入问题
773503
Falling_Sakura楼主2023/10/10 09:11

为什么用 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;
}
2023/10/10 09:11
加载中...