time limit: 10 sec
memory limit: 128 mb
submit: 1026
solved: 576 [
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上傳
【分析】
貌似和hdu 4622是一樣的...?
但是字元太多,要用map。
c++**好,map把你保(除了坑爹jloi還卡map)
【**】
#include#include#include#include#include#define ll long long
#define m(a) memset(a,0,sizeof a)
#define fo(i,j,k) for(i=j;i<=k;i++)
using namespace std;
const int mxn=100005;
ll ans;
map son[mxn<<1];
int n,len,tot,root,p,q,np,nq;
int s[mxn],pre[mxn<<1],step[mxn<<1];
inline void sam()
q=son[p][c];
if(step[p]+1==step[q])
pre[np]=q;
else
ans+=step[np]-step[pre[np]];
printf("%lld\n",ans); }}
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 拼湊起來形成乙個魔咒...
BZOJ4516 Sdoi2016 生成魔咒
bzoj4516 每次在結尾新增乙個數,相當於新增乙個字首。那麼倒過來看,變成每次在開頭新增乙個數,也就是新增乙個字尾。假若新的字尾長為 x 那麼相當於在原有的基礎上增加了 x個串,假設其中有 y 個串已經出現過。那麼a nsi ansi 1 x y考慮如何求這個y 考慮新加入的串和已有串的衝突。假...