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