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