世界線 bzoj2894 廣義字尾自動機

2022-05-19 21:48:12 字數 2027 閱讀 2151

由於春希對於第二世代操作的不熟練,所以剛使用完\(invasion process\)便掉落到了世界線之外,錯綜複雜的平行世界資訊湧入到春希的意識中。春希明白了事件的真相。

在乙個冬馬與雪菜同時存在的世界裡,傲嬌的冬馬最終還是博得了春希的內心。然而看著好友雪菜的消瘦,內心愧疚的冬馬啟動了第二世代操作,想找到乙個雪菜最終成功的世界,卻發現**都沒有。絕望的冬馬決定耗盡自己全部的第二世代操作點數,自創乙個沒有自己只有雪菜與春希的世界。

雖然這個世界一開始效果很好,春希與雪菜很快的被命運撮合在了一起,然而沒有了冬馬的雪菜,如沒有了大海的沙灘,失去了傍依。

雖然世界裡沒有冬馬的存在,但是由於冬馬創造時的疏忽,這個世界裡的雪菜依然存在著因獨佔春希而產生的對冬馬的愧疚感,這種愧疚感折磨著雪菜,最終雪菜選擇了自毀忘記春希。

看著這一切的春希深知不管是三個人一起的快樂,還是兩個人獨處的甜蜜,都無法消除冬馬與雪菜內心的自責,無論如何修改世界,三人都只會更加痛苦,於是春希使用了自己剩餘的全部操作點數,唸出了\(key world:whitealbum2\),開始了\(initialization process\).

在\(initialization process\)中,春希需要整理世界線,才能回歸原本的世界。

世界線是一棵根節點為1的樹,每個節點為1個字元。規定樹上的子串為從某個節點(不一定是1號節點)出發往其子節點走所形成的字串。每乙個子串相當於乙個平行世界,要想重構世界,就需要知道兩個資訊:

不同子串的個數

將不同的子串排序後,字典序第\(k-1\)小的子串。

如圖所示為乙個世界線的樣例,從\(4->5\)的子串為\(bb\),\(1->5\)的為\(abb\)

第一行兩個整數\(n\),\(q\)表示節點個數以及詢問個數

第二行\(n\)個字元,表示編號為\(i\)的字元是什麼。

接下來\(n-1\)行表示一棵樹。

接下來\(q\)行,每行乙個整數\(k\)

第一行為不同支付串個數。

接下來q行為q個詢問的答案(注意輸出的是第\(k-1\)小的子串,如果\(k=1\)請直接換行),如果不存在(不包括\(k=1\))輸出\(-1\).

8 1

abcbbaca

1 22 3

1 44 5

4 64 7

1 8

5

sample output

12

aba

12%:\(n<=10\)

另有48%為一條鏈;

100%: \(n<=250000\),\(q<=50000\).

給出一棵\(trie\)樹,求出上面所有字串的本質不同的子串的總數(算上空串),並求出其中的第\(k\)大子串。

給每個節點記錄乙個\(last\),每次加入字元的時候把\(last\)設為其父節點記錄的\(last\),然後就可以像普通的字尾自動機一樣建了。最後找第\(k\)小的子串如這個就行了

#includeusing namespace std;

const int n=600010;

int n,q;

int tot,bian[n<<1],nxt[n<<1],head[n];

inline void add(int x,int y)

char s[n];

int a[n],c[n];

struct sam

int p=last,np=++cnt;last=np;l[np]=l[p]+1;

for(;p&&!ch[p][c];p=fa[p])ch[p][c]=np;

if(!p)fa[np]=1;

else

}size[np]=1;

}void dfs(int x,int f)

}void build()

void calc()}}

void find(int k)

putchar('a'+a);k--;

p=ch[p][a];}}

}sam;

int main()

}}

bzoj 3277 串 (廣義字尾自動機)

time limit 10 sec memory limit 128 mb submit 357 solved 144 submit status discuss 字串是oi界常考的問題。現在給定你n個字串,詢問每個字串有多少子串 不包括空串 是所有n個字串中至少k個字串的子串 注意包括本身 第一行...

BZOJ 3277 串 廣義字尾自動機

判斷乙個串是否在至少k個字串裡面的方法後3473一樣,每新增乙個新的字元就沿fail鏈更新。剩下的問題就只是剩下了,每增加乙個新的字元,共多出現了多少個新的字串,如果不要求重複,那麼很顯然就是len u len fail u 這裡重複的字串也需要加入答案所以只用沿fail鏈dfs一下,sum u f...

bzoj3277 串 廣義字尾自動機

廣義字尾自動機板子題 廣義字尾自動機的建圖方法大概就是在trie上按bfs序來建圖,這裡的last節點應該是trie上父親的last節點 然後這裡按題目要求記right為在至少k個串走過的方案,具體建法就是先把每個串跑一遍然後在parent樹上更新所有父親節點的答案,注意不要判重。然後掃一遍所有節點...