SPOJ 694不同子串個數

2021-09-25 05:12:17 字數 3150 閱讀 6360

求乙個字串的不同子串個數。

字尾陣列求出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的做法 我的想法是這樣...