1304 字串的相似度 字尾陣列

2021-09-20 07:24:55 字數 2807 閱讀 7134

我們定義2個字串的相似度等於兩個串的相同字首的長度。例如 「abc」 同 「abd」 的相似度為2,「aaa」 同 「aaab」 的相似度為3。

給出乙個字串s,計算s同他所有字尾的相似度之和。例如:s = 「ababaa」,所有字尾為:

ababaa 6

babaa 0

abaa 3

baa 0

aa 1

a 1s同所有字尾的相似度的和 = 6 + 0 + 3 + 0 + 1 + 1 = 11

輸入輸入乙個字串s(1 <= l <= 1000000),l為字串s的長度,且s由a-z的小寫字母組成。

輸出輸出s同所有字尾的相似度的和。

輸入樣例

ababaa

輸出樣例

11字尾陣列模板題,倍增演算法o(nlogn)複雜度的過不去,需要dc3演算法o(n)複雜度才能卡過去(正解是exkmp演算法)但是我不會

倍增演算法

#include

using

namespace std;

const

int maxn =

1e6+5;

char s[maxn]

;int height[maxn]

, sa[maxn]

, tx[maxn]

, rak[maxn]

;struct node a[maxn]

, b[maxn]

;int n, m, p;

void

rsort()

for(

int i =

1; i <= n; i++

)for

(int i =

1; i <= m; i++

)for

(int i =

1; i <= n; i++

)for

(int i =

1; i <= m; i++

)for

(int i =

1; i <= n; i++

)for

(int i =

1; i <= m; i++

)for

(int i = n; i >=

1; i--)}

void

ssort()

rak[a[i]

.id]

= p;

}for

(int i =

1; i <= n; i++

) m = p;

}void

solve()

ssort()

;for

(int j =

1; j <= n; j <<=1)

ssort()

;if(p == n)}}

void

get_height()

int j = sa[rak[i]-1

];while

(i + k <= n && j + k <= n && s[i + k]

== s[j + k]

) height[rak[i]

]= k;}}

intmain()

mm =

1e9;

for(

int i = rak[1]

; i >=

1; i--

) cout << ans + n << endl;

return0;

}

dc3演算法

#pragma gcc optimize(2)

#pragma gcc optimize(3)

#pragma gcc optimize(4)

#include

#define rank rank

#define f(x) ((x)/3+((x)%3==1?0:tb))

#define g(x) ((x)using

namespace std;

const

int maxn=

1e6*3+

5;int n;

char s[maxn]

;int sa[maxn]

,rank[maxn]

,height[maxn]

;int r[maxn]

,wa[maxn]

,wb[maxn]

,wv[maxn]

,wws[maxn]

;void

sort

(int

*r,int

*a,int

*b,int n,

int m)

intc0

(int

*r,int a,

int b)

intc12

(int k,

int*r,

int a,

int b)

void

get_sa_dc3

(int

*r,int

*sa,

int n,

int m)

void

get_height

(int

*r,int

*sa,

int n)

intmain()

mm =

1e9;

for(

int i = rank[0]

; i >=

0; i--

)printf

("%lld\n"

, res + n)

;return0;

}

51nod 1304 字串的相似度

我們定義2個字串的相似度等於兩個串的相同字首的長度。例如 abc 同 abd 的相似度為2,aaa 同 aaab 的相似度為3。給出乙個字串s,計算s同他所有字尾的相似度之和。例如 s ababaa 所有字尾為 ababaa 6 babaa 0 abaa 3 baa 0 aa 1 a 1s同所有字尾...

51nod 1304 字串的相似度

我們定義2個字串的相似度等於兩個串的相同字首的長度。例如 abc 同 abd 的相似度為2,aaa 同 aaab 的相似度為3。給出乙個字串s,計算s同他所有字尾的相似度之和。例如 s ababaa 所有字尾為 ababaa 6 babaa 0 abaa 3 baa 0 aa 1 a 1 s同所有字...

51nod 1304 字串的相似度 exkmp

我們定義2個字串的相似度等於兩個串的相同字首的長度。例如 abc 同 abd 的相似度為2,aaa 同 aaab 的相似度為3。給出乙個字串s,計算s同他所有字尾的相似度之和。例如 s ababaa 所有字尾為 ababaa 6 babaa 0 abaa 3 baa 0 aa 1 a 1s同所有字尾...