我們定義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同所有字尾...