bzoj4516 Sdoi2016 生成魔咒

2021-08-14 16:26:24 字數 1518 閱讀 4158

time limit: 10 sec  

memory limit: 128 mb

submit: 1362  

solved: 766 [

submit][

status][

discuss]

魔咒串由許多魔咒字元組成,魔咒字元可以用數字表示。例如可以將魔咒字元 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 的生成魔咒數量

71 2 3 3 3 1 213

691217

22鳴謝menci上傳 [

submit][

status][

discuss]

get到乙個新姿勢:sam上節點u所代表的本質不同的子串的個數等於max[u] - max[fa[u]]

那麼接下來就很好搞了,直接邊插入邊維護就好

字母表用map儲存

**:

#include#include#include#include#include#include#include#include#include#includeusing namespace std;

typedef long long ll;

const int inf = 2147483647;

const int maxn = 100100;

int a[maxn];

mapch[maxn * 2];

int f[maxn * 2],max[maxn * 2],dp[maxn * 2],cnt[2 * maxn],tot = 1,last = 1;

ll n,ans;

inline ll getint()

while (c >= '0' && c <= '9')

ret = ret * 10 + c - '0',c = getchar();

return ret * f;

}inline ll cal(int u)

inline void insert(int c)

int p = ch[v][c];

if (max[p] != max[v] + 1)

else f[last] = p;

ans += cal(last);

}int main()

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 的非空字...