美團杯2020 半字首計數

2021-10-06 06:52:16 字數 1860 閱讀 2642

題意:定義半字首是 s[1

:i]+

s[j:

k]

s[1:i]+s[j:k]

s[1:i]

+s[j

:k], 其中 0≤i

n(s)

,i

len(

s),j

−1≤k

≤len

(s

)0≤i0≤

in(s)

,ilen(

s),j

−1≤k

≤len

(s)。直觀上來說,你可以把半字首理解成某乙個字首 s[1:k] 刪除掉某乙個子串後形成的結果(當然也允許不刪)。

給出字串 s,你需要求出 s 的所有半字首中,有多少個不同的字串。

資料範圍:1

<=∣

s∣

<=1

06

1<=|s|<=10^6

1<=∣

s∣<=1

06。題解:對於乙個半字首s[1

:i]+

s[j:

k]

s[1:i]+s[j:k]

s[1:i]

+s[j

:k],如果有s[1

:i+1

]+s[

j+1:

k]

s[1:i+1]+s[j+1:k]

s[1:i+

1]+s

[j+1

:k]與其相等即s[i

+1]=

s[j]

s[i+1] = s[j]

s[i+1]

=s[j

]時,則說明這個半字首重複了。因此,對於每個字首s[1

:i

]s[1:i]

s[1:i]

,我們統計s[i

+1:∣

s∣

]s[i+1:|s|]

s[i+1:

∣s∣]

中有多少不同子串不以s[i

+1

]s[i+1]

s[i+1]

開始,把這些加起來就是答案。我們將串倒序加入字尾自動機,這樣我們就能夠知道每次以s[i

]s[i]

s[i]

開始的子串數量。然後對於每個字首統計答案即可。注意計算空串。

**:

/*

定義半字首為s[1...i] + s[j...k]

求本質不同的半字首數量

思路:如果存在乙個半字首s[1...i] s[j...k] 滿足 s[i + 1] = s[j] 說明這是重複的半字首。

*/#include

using

namespace std;

typedef

long

long ll;

const

int maxn =

1e6+7;

struct node

}sa[maxn <<1]

;int cnt, root, last;

intnewnode

(int len)

void

pre(

)int

sam(

int alp)

} last = np;

return sa[np]

.len - sa[sa[np]

.pa]

.len;

}char s[maxn]

;ll occ[30]

;int

main()

printf

("%lld\n"

, ans +1)

;return0;

}

美團杯2020 半字首計數 字尾自動機

題目大意 蒜斜剛來pku的時候還不知道有 北大算協 這個社團,因此他總是覺得周圍的人在偷偷議論著他,比如說 算協 注 非蒜斜 舉辦的活動好有趣啊!算協 注 非蒜斜 好帥啊!蒜斜每次聽到這些話就會想入非非,但仔細想想,自己好像也沒有那麼帥吧?最離譜的一次還是 算協 注 非蒜斜 有好多小哥哥 霧 自從蒜...

美團杯2020 查查查樂樂(dp)

a.美團杯2020 查查查樂樂 查查查樂樂 是一段古老神秘的咒語,只有被選中的魔法師才有資格使用這一段咒語並享用它所帶來的力量 而如果這段咒語出現在了不具資格的魔法師的口中,這個魔法師將會遭到咒語的反噬並付出可怕的代價。這個學期,鎂團在一家魔法早教學校做兼職,他的任務是教小學生們魔法並幫助他們準備一...

美團2020後台校招題目 美團騎手包裹區間分組

2110年美團外賣火星第3000號配送站點有26名騎手,分別以大寫字母a z命名,因此可以稱呼這些騎手為黃家騎士 a,黃家騎士 b 黃家騎士 z,某美團黑珍珠餐廳的外賣流水線上會順序產出一組包裹,美團配送排程引擎已經將包裹分配到騎手,並在包裹上貼上好騎手名稱,如rettebtae代表一組流水線包裹共...