【后缀自动机】 SPOJ SUBLEX

来源:互联网 发布:怎么修改手机游戏数据 编辑:程序博客网 时间:2024/05/18 00:04

这题也是CLJ论文上的题目,做法CLJ论文讲了。。。这里不多说了。。。。

#include <iostream>#include <queue> #include <stack> #include <map> #include <set> #include <bitset> #include <cstdio> #include <algorithm> #include <cstring> #include <climits>#include <cstdlib>#include <cmath>#include <time.h>#define maxn 200005#define maxm 100005#define eps 1e-7#define mod 1000000007#define INF 0x3f3f3f3f#define PI (acos(-1.0))#define lowbit(x) (x&(-x))#define mp make_pair#define ls o<<1#define rs o<<1 | 1#define lson o<<1, L, mid #define rson o<<1 | 1, mid+1, R#define pii pair<int, int>#pragma comment(linker, "/STACK:16777216")typedef long long LL;typedef unsigned long long ULL;//typedef int LL;using namespace std;LL qpow(LL a, LL b){LL res=1,base=a;while(b){if(b%2)res=res*base;base=base*base;b/=2;}return res;}LL powmod(LL a, LL b){LL res=1,base=a;while(b){if(b%2)res=res*base%mod;base=base*base%mod;b/=2;}return res;}// headstruct node{int len, cnt, vis;node *fa, *next[26];}pool[maxn], *last, *root;vector<int> ans;char s[maxn];int tot, m, k;node* newnode(int len){node *p = &pool[tot++];p->len = len, p->cnt = p->vis = 0, p->fa = 0;memset(p->next, 0, sizeof p->next);return p;}void init(){tot = 0;root = newnode(0);last = root;}void add(int c){node *p = last, *np = newnode(p->len + 1);last = np;for(; p && !p->next[c]; p = p->fa) p->next[c] = np;if(!p) np->fa = root;else {node *q = p->next[c];if(p->len + 1 == q->len) np->fa = q;else {node *nq = newnode(p->len + 1);*nq = *q;nq->len = p->len + 1;q->fa = np->fa = nq;for(; p && p->next[c] == q; p = p->fa) p->next[c] = nq;}}}void DFS(node *p){p->cnt = p->vis = 1;for(int i = 0; i < 26; i++) if(p->next[i]) {if(!p->next[i]->vis) DFS(p->next[i]);p->cnt += p->next[i]->cnt;}}void dfs(node *p){if(k <= 0) return;for(int i = 0; i < 26; i++) if(p->next[i]) {if(k > p->next[i]->cnt) k -= p->next[i]->cnt;else {ans.push_back('a' + i);k--;dfs(p->next[i]);break;}}}void read(){scanf("%s%d", s, &m);for(int i = 0; s[i]; i++) add(s[i] - 'a');}void work(){DFS(root);while(m--) {ans.clear();scanf("%d", &k);dfs(root);for(int i = 0; i < ans.size(); i++) printf("%c", ans[i]);printf("\n");}}int main(){init();read();work();return 0;}


0 0