bzoj4516 Sdoi2016 生成魔咒

2022-08-15 04:15:11 字數 1438 閱讀 8479

字尾陣列,首先先將陣列反轉,從後往前做,此時的字尾就等於是原串的字首,那麼每新增乙個字首,增加了多少個不同的子串,其實就是在之前新增的字首中,排名最靠近該字首的兩個串a和b,計算出他們與該字首的lcp,然後不同的子串數就是當前新增的字首長度len-max(lcpa,lcpb)了。具體實現維護排名可以用乙個set維護,複雜度o(nlogn)。

**

1  #include 2 #include 3 #include4 #include

5using

namespace

std;

6const

int l = 110;7

const

int n = 1010;8

9const

int maxn = n*l; //

數列的最大值和個數上界

1011

struct

suffixarray

3334

int cmp(int *r, int a, int b, int

l)37

38void calsa()55}

5657

void calheight()

63//

-求任意兩字尾最長公共字首問題,如果沒用到可以去掉----------------------

64int

log[maxn];

65int best[20

][maxn];

66void initrmq()

71for(int i = 1; i <= n ; i ++) best[0][i] =height[i];

72for(int i = 1; i <= log[n] ; i ++) 77}

78}79int lcp(int a,int b)

85 a ++;

86int t = log[b - a + 1

];87

return (best[t][a] > best[t][b - (1

<1])? best[t][b - (1

<1

] : best[t][a];88}

89}sa;

90int

n,i,a[maxn],m,u,v,tot,len,t,tmp;

91long

long

ans;

92 mapma;

93set

s;94set

::iterator it;

95int

main()

96104

for (i=0;i1-i;i++)

105108 sa.input(a,n,tot+10

);109

sa.initrmq();

110for (i=n-1;i>=0;i--)

111120

121 }

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