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