求乙個字串的不同子串個數。
字尾陣列求出sa和height
每 乙個
字尾sa
[i]貢
獻n+1
−sa[
i]個前
綴,減去
heig
ht[i
]就是和
前乙個後
綴相同的
字首個數
,累加就
是答
案每乙個字尾sa[i]貢獻n+1-sa[i]個字首,減去height[i]就是和前乙個字尾相同的字首個數,累加就是答案
每乙個字尾s
a[i]
貢獻n+
1−sa
[i]個
字首,減
去hei
ght[
i]就是
和前乙個
字尾相同
的字首個
數,累加
就是答案舉個
例子ab
aabc
舉個例子 abaabc
舉個例子ab
aabc
排 序後
:排序後:
排序後:
① aabc sa[1]=2
② abaabc sa[2]=0
③ abc sa[3]=3
④ baabc sa[4]=1
⑤ bc sa[5]=4
⑥ c sa[6]=5
排 名第
一的字尾
aabc
,它產生
的字首有
a,aa
,aab
,aab
c排名第一的字尾 aabc,它產生的字首有a,aa,aab,aabc
排名第一的後
綴aab
c,它產
生的字首
有a,a
a,aa
b,aa
bc排 名第
二的字尾
abaa
bc,它
產生的前
綴有a,
ab,a
ba,a
baa,
abaa
b,ab
aabc
排名第二的字尾abaabc,它產生的字首有a,ab,aba,abaa,abaab,abaabc
排名第二的後
綴aba
abc,
它產生的
字首有a
,ab,
aba,
abaa
,aba
ab,a
baabc他們
的hei
ght值
為1,即
最長公共
字首長度
為1,很
明顯這兩
個字尾只
有乙個公
共字首,
所以計算
第二個後
綴對答案
的貢獻值
時要減去
與第乙個
字尾相同
的字首個
數,就是
heig
ht
他們的height值為1,即最長公共字首長度為1,很明顯這兩個字尾只有乙個公共字首,所以計算第二個字尾對答案的貢獻值時要減去與第乙個字尾相同的字首個數,就是height
他們的hei
ght值
為1,即
最長公共
字首長度
為1,很
明顯這兩
個字尾只
有乙個公
共字首,
所以計算
第二個後
綴對答案
的貢獻值
時要減去
與第乙個
字尾相同
的字首個
數,就是
heig
ht
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace std;
#define inf 0x3f3f3f3f
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define mem(a,b) memset(a,b,sizeof(a));
#define lowbit(x) x&-x;
typedef
long
long ll;
typedef
unsigned
long
long ull;
const
double eps =
1e-6
;const
int nmax =
5e5+5;
char s1[nmax]
;char s2[nmax]
;char str[nmax]
;int sa[nmax]
, rk[nmax]
, h[nmax]
;int wa[nmax]
, wb[nmax]
, wv[nmax]
, c[nmax]
, vis[
1005
], id[nmax]
;int ca;
intcmp
(int
*r,int a,
int b,
int l)
void
get_sa
(char
*r,int n,
int m)}}
void
get_height
(char
*r,int n)
}//setst;
intcheck
(int n,
int pos)
else
if(sa[i]
< pos && sa[i-1]
> pos)
}return res;
}//aabaaba abaabaa
//abcdec abcdeca
intmain()
cout<}}
spoj 694 不相同的子串的個數
字尾陣列 處理字串的有力工具 題目大意 要求求乙個字串中不同子串的個數 解題思路 利用字尾陣列,每個子串一定是某個字尾子串的字首,求多少個不同的子串等價於求出所有字尾之間的不相同的字首的個數。設字串為str,sa i 表示排名第i的字尾從str的第sa i 個位置開始,rank i 表示str i ...
字尾陣列入門 SPOJ694
求單個子串的不重複字串的個數 t 20,len 1000 這是一道經典的字尾陣列入門題。由於剛開始學,對字尾陣列的理解還很抽象,於是拿這道題先找找感覺。首先,每個子串都可以理解成是某個字尾的字首,這是聯想到字尾陣列演算法的重要一步。接著,對於每乙個sa i 字尾陣列,含義為第i小的字尾的起始位置是s...
SPOJ705 不同的子串
我是萌萌的傳送門 看來我的做法也沒錯嘛.看別人的 寫字尾陣列的好像是利用sa和height什麼的搞一搞,看了看表示沒看懂 看了看字尾自動機眾的 好像是用什麼np len np par len更新答案,看了看表示理解不了 於是根據我對字尾自動機的理解強行yy了一發字尾自動機 dp的做法 我的想法是這樣...