发现对SAM还是相当的不熟悉。。。专门开一个SAM练习好了。。。估计以后还要来个字符串恶补。。。
挖坑:3277 3473 3413 2806 2780 2555 3897
【bzoj3998】
求第k小子字符串,分算上重复和不算上重复。
十分地裸,如果不算重的话除了root以外所有节点的val都是1然后求sum,如果算的话就只是后缀节点的val是1然后再求sum。
很sb啦
然而把add写错了,查了半个小时QAQ
#include <bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define per(i,a,b) for(int i=a;i>=b;i--)
#define maxn 2000007
typedef long long ll;
typedef int arr[maxn];
typedef int sam[maxn][26];
int n , tot , ed , T;
arr len , fa , cnt , tp ;
sam go;
int val[maxn] , sum[maxn] , K;
void add(int c , int l) {
int p = ed , np = ed = ++ tot;
len[np] = len[p] + 1, val[np] = 1;
for(;p && !go[p][c];p = fa[p]) go[p][c] = np;
if (!p)
{ fa[np] = 1 ; return ; }
int q = go[p][c] ;
if (len[q] == len[p] +