bzoj2865 字串識別 字尾自動機 線段樹

2021-08-15 02:20:59 字數 1834 閱讀 9710

description

xx在進行字串研究的時候,遇到了乙個十分棘手的問題。

在這個問題中,給定乙個字串s,與乙個整數k,定義s的子串t=s(i, j)是關於第k位的識別子串,滿足以下兩個條件:

1、i≤k≤j。

2、子串t只在s中出現過一次。

例如,s=」banana」,k=5,則關於第k位的識別子串有」nana」,」anan」,」anana」,」nan」,」banan」和」banana」。

現在,給定s,xx希望知道對於s的每一位,最短的識別子串長度是多少,請你來幫助他。

input

僅一行,輸入長度為n的字串s。

output

輸出n行,每行乙個整數,第i行的整數表示對於第i位的最短識別子串長度。

sample input

agoodcookcooksgoodfood

sample output

1 2

3 3

2 2

3 3

2 2

3 3

2 1

2 3

3 2

1 2 3 4

hint

n<=5*10^5

題解 只出現一次就是字尾自動機中right=1的串。

字尾自動機中某個狀態串表示[l,r-x]的範圍

於是我們對[r-x,r]維護最小值f[i]

對[l,r-x]維護最小值f[i]=min(f[i],r-i)

記g[i]=f[i]+i

則維護最小值g[i]=min(g[i],r)

兩棵線段樹維護即可。

**

#include

#include

#include

#include

#define ll long long

#define mod 1000003

#define eps (1e-10)

#define inf 1000000000

using namespace std;

inline int

read()

while (ch>='0'&&ch<='9')

return

x*f;

}const int n=900005;

int trans[n][26],right[n],l[n],r[n],fa[n],t[500005],q[n];

intlast,cnt,s,n;

char s[n];

struct node

int mid=(l+r)>>1;

if (y

<=mid) modify(k<<1,l,mid,x,y,z);

else

if (x>mid) modify(k<<1|1,mid+1,r,x,y,z);

else modify(k<<1,l,mid,x,mid,z),modify(k<<1|1,mid+1,r,mid+1,y,z);

}int query(int k,int l,int r,int

x)

void build(int k,int l,int r,int f)

int mid=(l+r)>>1;

build(k<<1,l,mid,f);build(k<<1|1,mid+1,r,f);

}}t1,t2;

inline void add(int

x) }

}void pre()

}int main()

for (int i=1;i<=n;i++)

return

0;}

bzoj 2865 字串識別 字尾陣列 線段樹

在這個問題中,給定乙個字串s,與乙個整數k,定義s的子串t s i,j 是關於第k位的識別子串,滿足以下兩個條件 1 i k j。2 子串t只在s中出現過一次。例如,s banana k 5,則關於第k位的識別子串有 nana anan anana nan banan 和 banana 現在,給定s...

BZOJ3473 字串 廣義字尾自動機

今天主攻了下sam 好多東西以前都沒理解到 對於這道題 我們建乙個自動機存所有串 每個穿last從1開始 對於自動機上每個點額外記乙個cnt 表示能匹配到這個點的不同串個數 建完對每個串在自動機上匹配 把到的每個點x和par x par par x 的cnt 然後就從父親往兒子傳遞一下 這樣每個點i...

BZOJ 3473 字串 廣義字尾自動機

time limit 20 sec memory limit 256 mb submit 354 solved 160 submit status discuss 給定n個字串,詢問每個字串有多少子串 不包括空串 是所有n個字串中至少k個字串的子串?第一行兩個整數n,k。接下來n行每行乙個字串。一行...