萌新求助
查看原帖
萌新求助
245875
Ame__楼主2021/1/29 17:15

鸡排SAMSAM写法,不知道为什么WAWA,求助

// Author: Ame__
#include<bits/stdc++.h>
#define _ 0
#define qwq double
#define AME__DEBUG
#define LL long long
#define bomb exit(0)
#define LOG(FMT...) fprintf(stderr , FMT)
#define TOWA(FMT...) fprintf(stdout , FMT)
using namespace std;
/*Grievous Lady*/
    
const int BUF_SIZE = 1 << 12;
    
char buf[BUF_SIZE] , *buf_s = buf , *buf_t = buf + 1;
    
#define PTR_NEXT() \
{ \
    buf_s ++; \
    if(buf_s == buf_t) \
    { \
        buf_s = buf; \
        buf_t = buf + fread(buf , 1 , BUF_SIZE , stdin); \
    } \
}
    
#define mians(_s_) \
{ \
    while(!isgraph(*buf_s)) PTR_NEXT();\
    char register *_ptr_ = (_s_); \
    while(isgraph(*buf_s) || *buf_s == '-') \
    { \
        *(_ptr_ ++) = *buf_s; \
        PTR_NEXT(); \
    } \
    (*_ptr_) = '\0'; \
}
    
template <typename _n_> void mian(_n_ & _x_){
    char buf_s; while(buf_s != '-' && !isdigit(buf_s)) buf_s = getchar();
    bool register _nega_ = false; if(buf_s == '-'){ _nega_ = true; buf_s = getchar(); }
    _x_ = 0; while(isdigit(buf_s)){  _x_ = _x_ * 10 + buf_s - '0'; buf_s = getchar(); } if(_nega_) _x_ = -_x_;
}
    
const int kato = 1e6 + 10;

template <typename _n_> bool cmax(_n_ &a , const _n_ &b){ return a < b ? a = b , 1 : 0; }
    
template <typename _n_> bool cmin(_n_ &a , const _n_ &b){ return a > b ? a = b , 1 : 0; }
    
int n , k;

char s[kato];

namespace towa{
    struct SuffixAutoMaton{
    protected:
        struct node{
            static const size_t CHARSET_SIZE = 26;
            node *ch[CHARSET_SIZE] , *nxt;
            int len , size;
            node(node *nxt = 0x0 , int len = 0 , int size = 0): nxt(nxt) , len(len) , size(size){
                memset(ch , 0x0 , sizeof ch);
            }
        }*root , *ls , *tail , _pool[kato] , *id[kato];

        int c[kato];

        inline void extend(int c){
            node *u = new(tail ++) node(0x0 , ls -> len + 1 , 1) , *v = ls;
            for(; v && !v -> ch[c] ; v = v -> nxt) v -> ch[c] = u;
            if(!v) u -> nxt = root;
            else if(v -> ch[c] -> len == v -> len + 1) u -> nxt = v -> ch[c];
            else{
                node *n = new(tail ++) node(0x0 , v -> len + 1) , *o = v -> ch[c];
                copy(o -> ch , o -> ch + node::CHARSET_SIZE , n -> ch);
                n -> nxt = o -> nxt , o -> nxt = u -> nxt = n;
                for(; v && v -> ch[c] == o ; v = v -> nxt) v -> ch[c] = n;
            }
            ls = u;
        }

        void clear(){ tail = _pool , root = ls = new(tail ++) node(); }
    public:
        SuffixAutoMaton(){ clear(); }

        inline void get_id(){
            int maxlen = 0;
            for(node *o = _pool ; o != tail ; o ++) c[o -> len] ++ , maxlen = max(maxlen , o -> len);
            for(int i = 1;i <= maxlen;i ++) c[i] += c[i - 1];
            for(node *o = _pool ; o != tail ; o ++) id[--c[o -> len]] = o;
        }

        inline void get_size(){
            get_id();
            for(int i = tail - _pool - 1 ; i ; i --){
                node *o = id[i];
                for(int i = 0;i < 26;i ++) if(o -> ch[i]) o -> size += o -> ch[i] -> size;
            }
        }

        inline void insert(char *s){ for(char *p = s ; *p ; p ++) extend(*p - 'a'); }

        inline void kth(node *o , int k){
            if(!k) return;
            for(int i = 0;i < 26;i ++){
                if(o -> ch[i]){
                    if(o -> ch[i] -> size >= k){
                        putchar((char)i + 'a');
                        kth(o -> ch[i] , k - 1);
                        return;
                    }else k -= o -> ch[i] -> size;
                }
            }
        }

        inline void doit(char *s){ insert(s); get_size(); }

        inline void kth(int k){ kth(root , k); }
    }yuni;
}

inline int Ame_(){
#ifdef AME__
    freopen(".in" , "r" , stdin); freopen(".out" , "w" , stdout); int nol_cl = clock();
#endif
    scanf("%s" , s); towa::yuni.doit(s);
    mian(n);
    for(; n --> 0 ;){
        mian(k);
        towa::yuni.kth(k); TOWA("\n");
    }
#ifdef AME__TIME
    LOG("Time: %dms\n", int((clock() - nol_cl) / (qwq)CLOCKS_PER_SEC * 1000));
#endif
    return ~~(0^_^0); /*さようならプログラム*/
}
    
int Ame__ = Ame_();
    
int main(){;}

/*
aaa
2
4
3
*/
2021/1/29 17:15
加载中...