QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#453748#8819. CNOI Knowledgeucup-team956Compile Error//C++202.6kb2024-06-24 10:25:052024-06-24 10:25:05

Judging History

你现在查看的是最新测评结果

  • [2024-06-24 10:25:05]
  • 评测
  • [2024-06-24 10:25:05]
  • 提交

answer

#include<bits/stdc++.h>
using namespace std;
#define time chrono::system_clock::now().time_since_epoch().count()
mt19937_64 rnd(time);
#define maxn 2005
#define int long long
const int mod = 998244353;

int read() {int x;cin>>x;return x;}

int mp[maxn][maxn], ff[maxn][maxn];

int ask(int l, int r) {
    if(l == r) return 1;
    if(mp[l][r]) return mp[l][r];
    if(ff[l][r]) return ff[l][r];
    cout << "? " << l << " " << r << endl;
    int x = read();
    mp[l][r] = x;
    return x;
}

map<int, int> vis;
int get() {
    int val;
    while(1) {
        val = rnd() % mod + 1;
        if(!vis[val]) {
            vis[val] = 1;
            break;
        }
    }
    return val;
}

// int f[maxn][maxn];

struct SAM{
    int left, tot=1,lt=1,num,l[maxn],sz[maxn],f[maxn],last[maxn];
    map<int, int> ch[maxn];
    void insert(int c, int r){
        int v=++tot,u=lt;lt=tot;
        sz[v]=1;l[v]=l[u]+1;
        while(u&&!ch[u][c]) {ch[u][c]=v;u=f[u];}
        if(!u) {f[v]=1; ff[left][r] += l[v] - l[f[v]]; return;}
        int x=ch[u][c];
        if(l[x]==l[u]+1) {f[v]=x; ff[left][r] += l[v] - l[f[v]]; return;}
        int y=++tot;
        ff[left][r] -= l[x] - l[f[x]];
        l[y]=l[u]+1;
        f[y]=f[x]; ff[left][r] += l[y] - l[f[y]];
        f[x]=f[v]=y; ff[left][r] += l[x] - l[f[x]] + l[v] - l[f[v]];
        ch[y] = ch[x];
        // memcpy(ch[y],ch[x],sizeof(ch[x]));
        while(u&&ch[u][c]==x) {ch[u][c]=y;u=f[u];}
    }
}sam[maxn];

void solve() {
    int n = read();
    vector<int> ans(n + 1);
    ans[1] = get();
    for(int i = 1; i <= n; i++) sam[i].left = i;
    sam[1].insert(ans[1], 1);
    for(int i = 2; i <= n; i++) {
        int l = 1, r = i - 1;
        while(l <= r) {
            int mid = (l + r) >> 1;
            int len = i - mid + 1, need = len * (len + 1) / 2; 
            if(ask(mid, i) - ask(mid, i - 1) == i - mid + 1) {
                r = mid - 1;
            }
            else {
                l = mid + 1;
            }
        }
        // cout << i << " -> " << r << "!!\n";
        if(r == 0) ans[i] = get();
        else ans[i] = ans[r];
        for(int j = 1; j <= i; j++) {
            sam[j].insert(ans[i], i);
        }
        // if(i == 2 || i == 3) {
            // for(int j = 1; j <= 3; j++) {
                ff[j][i] += ff[j][i - 1];
                // cout << j << " " << i << " " << ff[j][i] << "\n";
            // }
        // }
    }
    cout << "! ";
    for(int i = 1; i <= n; i++) {
        cout << ans[i] << " ";
    }
    cout << endl;
}

signed main() {
    solve();
    return 0;
}

Details

answer.code: In function ‘void solve()’:
answer.code:85:20: error: ‘j’ was not declared in this scope
   85 |                 ff[j][i] += ff[j][i - 1];
      |                    ^