bzoj4516 SDOI2016 生成魔咒

2022-05-30 20:12:11 字數 1315 閱讀 8228

魔咒串由許多魔咒字元組成,魔咒字元可以用數字表示。例如可以將魔咒字元 1、2 拼湊起來形成乙個魔咒串 [1,2]。

乙個魔咒串 s 的非空字串被稱為魔咒串 s 的生成魔咒。

例如 s=[1,2,1] 時,它的生成魔咒有 [1]、[2]、[1,2]、[2,1]、[1,2,1] 五種。s=[1,1,1] 時,它的生成魔咒有 [1]、

[1,1]、[1,1,1] 三種。最初 s 為空串。共進行 n 次操作,每次操作是在 s 的結尾加入乙個魔咒字元。每次操作後都

需要求出,當前的魔咒串 s 共有多少種生成魔咒。

第一行乙個整數 n。

第二行 n 個數,第 i 個數表示第 i 次操作加入的魔咒字元。

1≤n≤100000。,用來表示魔咒字元的數字 x 滿足 1≤x≤10^9

輸出 n 行,每行乙個數。第 i 行的數表示第 i 次操作後 s 的生成魔咒數量

7

1 2 3 3 3 1 2

136

9121722

字尾陣列。

把原串\(reverse\)一下,建出字尾陣列,求一下\(height\)陣列。

然後按字尾的字典序建乙個鍊錶,每次考慮把串第乙個位置的字尾算出貢獻,然後利用鍊錶合併一下\(height\)就好了。

最後倒序字首和輸出答案就行了。

#includeusing namespace std;

#define ll long long

void read(int &x)

void print(ll x)

void write(ll x)

const int maxn = 1e6+10;

const int inf = 1e9;

int n,w[maxn],r[maxn];

int spx[maxn],spy[maxn],sum[maxn],sa[maxn],rk[maxn],height[maxn],d[maxn][20],lg[maxn];

void build()

for(int i=1;i<=n;i++) rk[sa[i]]=i;p=1;

for(int i=1;i<=n;i++)

}ll tmp[maxn];

int pre[maxn],nxt[maxn];

int main()

reverse(tmp+1,tmp+n+1);

for(int i=1;i<=n;i++) tmp[i]+=tmp[i-1],write(tmp[i]);

return 0;

}

bzoj4516 SDOI2016 生成魔咒

time limit 10 sec memory limit 128 mb submit 376 solved 232 submit status discuss 魔咒串由許多魔咒字元組成,魔咒字元可以用數字表示。例如可以將魔咒字元 1 2 拼湊起來形成乙個魔咒串 1,2 乙個魔咒串 s 的非空字串...

bzoj4516 Sdoi2016 生成魔咒

4516 sdoi2016 生成魔咒 time limit 10 sec memory limit 128 mb submit 575 solved 327 submit status discuss 魔咒串由許多魔咒字元組成,魔咒字元可以用數字表示。例如可以將魔咒字元 1 2 拼湊起來形成乙個魔咒...

bzoj 4516 Sdoi2016 生成魔咒

time limit 10 sec memory limit 128 mb submit 1026 solved 576 submit status discuss 魔咒串由許多魔咒字元組成,魔咒字元可以用數字表示。例如可以將魔咒字元 1 2 拼湊起來形成乙個魔咒串 1,2 乙個魔咒串 s 的非空字...