BZOJ4516 Sdoi2016 生成魔咒

2021-08-02 11:51:50 字數 1409 閱讀 7657

bzoj4516

每次在結尾新增乙個數,相當於新增乙個字首。

那麼倒過來看,變成每次在開頭新增乙個數,也就是新增乙個字尾。

假若新的字尾長為

x ,那麼相當於在原有的基礎上增加了

x個串,假設其中有

y 個串已經出現過。 那麼a

nsi=

ansi

−1+x

−y考慮如何求這個y

考慮新加入的串和已有串的衝突。假設新串s=

aadd

,原有串ss

=add

新加入4個串的應該是

a ,aa

,add

,aad

d 。顯然

a 重複了。

再舉幾個例子試一試,發現兩個衝突數就是lc

p。對反過來的串做字尾陣列。

當前加入第

i 個值,那麼就在所有長度小於

i的字尾中,找乙個字尾使得它與當前字尾的lc

p 值最大。

至於如何找,其實就是找乙個前驅乙個後繼。由於比較特殊,樹狀陣列就可以解決了。

#include 

#include

#include

#include

#include

#include

#define n 100005

#define m 160405

#define mod 1000000000

#define inf 0x7fffffff

using

namespace

std;

typedef

long

long ll;

typedef pair pa;

ll read()

while(isdigit(ch))

return x*f;

}int n,m;ll ans;

int c[n],sa[n],rank[n],height[n],a[n],x[n],y[n];

int mn[n],mx[n],lcp[n][30],hash[n],bit[n];

int lowbit(int x)

void build_sa()

}void get_height()

}void rmq()

int findpre(int x)

int findnex(int x)

void addmx(int x)

void addmn(int x)

int get_lcp(int x,int y)

void solve()

}int find(int x)

return rtn;

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