3926 Zjoi2015 諸神眷顧的幻想鄉

2021-07-26 03:33:02 字數 2611 閱讀 5818

time limit: 10 sec  

memory limit: 512 mb

submit: 1077  

solved: 631 [

submit][

status][

discuss]

幽香是全幻想鄉里最受人歡迎的萌妹子,這天,是幽香的2600歲生日,無數幽香的粉絲到了幽香家門前的太陽花田上來為幽香慶祝生日。 

粉絲們非常熱情,自發組織表演了一系列節目給幽香看。幽香當然也非常高興啦。 

這時幽香發現了一件非常有趣的事情,太陽花田有n塊空地。在過去,幽香為了方便,在這n塊空地之間修建了n-1條邊將它們連通起來。也就是說,這n塊空地形成了乙個樹的結構。 

有n個粉絲們來到了太陽花田上。為了表達對幽香生日的祝賀,他們選擇了c中顏色的衣服,每種顏色恰好可以用乙個0到c-1之間的整數來表示。並且每個人都站在乙個空地上,每個空地上也只有乙個人。這樣整個太陽花田就花花綠綠了。幽香看到了,感覺也非常開心。 

粉絲們策劃的乙個節目是這樣的,選中兩個粉絲a和b(a和b可以相同),然後a所在的空地到b所在的空地的路徑上的粉絲依次跳起來(包括端點),幽香就能看到乙個長度為a到b之間路徑上的所有粉絲的數目(包括a和b)的顏色序列。一開始大家打算讓人一兩個粉絲(注意:a,b和b,a是不同的,他們形成的序列剛好相反,比如紅綠藍和藍綠紅)都來一次,但是有人指出這樣可能會出現一些一模一樣的顏色序列,會導致審美疲勞。 

於是他們想要問題,在這個樹上,一共有多少可能的不同的顏色序列(子串)幽香可以看到呢? 

太陽花田的結構比較特殊,只與乙個空地相鄰的空地數量不超過20個。 

第一行兩個正整數n,c。表示空地數量和顏色數量。 

第二行有n個0到c-1之間,由空格隔開的整數,依次表示第i塊空地上的粉絲的衣服顏色。(這裡我們按照節點標號從小到大的順序依次給出每塊空地上粉絲的衣服顏色)。 

接下來n-1行,每行兩個正整數u,v,表示有一條連線空地u和空地v的邊。 

一行,輸出乙個整數,表示答案。 

7 30 2 1 2 1 0 0

1 23 4

3 54 6

5 72 5

30對於所有資料,1<=n<=100000, 1<=c<=10。 

對於15%的資料,n<=2000。 

另有5%的資料,所有空地都至多與兩個空地相鄰。 

另有5%的資料,除一塊空地與三個空地相鄰外,其他空地都分別至多與兩個空地相鄰。 

另有5%的資料,除某兩塊空地與三個空地相鄰外,其他空地都分別至多與兩個空地相鄰

[ submit][

status][

discuss]

任意兩點間的路徑構成乙個路徑串,葉節點個數不超過20

考慮每個葉節點輪流做一次根,構成一棵trie,

這樣,所有子串都可以表示成某一棵trie中某個點到它某個子孫的路徑

trie之間顯然是可以合併的,把這20棵trie合併起來,剩下就是統計這裡面的子串數

如果是一條鏈的情況,顯然可以用字尾自動機處理

現在是在trie上,就要用到廣義字尾自動機了

其實就是每個節點儲存它在自動機中的位置,對於兒子的extend操作,last直接使用父親的位置就行

詳細的證明可見lyy2023年的集訓隊**

#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;

const int maxn = 1e5 + 10;

const int t = 20;

const int n = 10;

const int maxm = maxn*t*2;

typedef long long ll;

int n,c,rt,cnt,tot,root,ch[maxm][n],len[maxm],fail[maxm]

,last[maxm],l[maxm],son[maxn*t][n],id[maxn],du[maxn],num[maxn];

ll siz[maxm];

bool vis[maxm];

vector v[maxn];

void dfs1(int x,int fa)

}int extend(int p,int nex,int len)

int q = ch[p][nex];

if (len[q] - len[p] == 1) fail[np] = q;

else

return np;

}void dfs2(int x)

}void calc(int x)

int getint()

int main()

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

last[root] = rt; dfs2(root); calc(rt); cout << siz[rt];

return 0;

}

ZJOI2015 諸神眷顧的幻想鄉

p3256 zjoi2015 day1 諸神眷顧的幻想鄉 時間限制 20000 ms 空間限制 524288 kb 問題描述 幽香是全幻想鄉里最受人歡迎的萌妹子,這天,是幽香的2600歲生日,無數幽香的粉絲到了幽香家門前的太陽花田上來為幽香慶祝生日。粉絲們非常熱情,自發組織表演了一系列節目給幽香看。...

ZJOI2015 諸神眷顧的幻想鄉

一行乙個整數表示答案 7 3 0 2 1 2 1 0 0 1 2 3 4 3 5 4 6 5 7 2 5n 100000,c 10 發現葉子只有10個,那麼可以以每個葉子為根,建trie,然後建廣義字尾自動機 對於每個狀態,代表的字串個數就是max min 1 include include inc...

ZJOI2015 諸神眷顧的幻想鄉

求不同的子串個數 如果規定根的話,那麼彎曲的路徑難以處理。由於只有20個葉子,所以以每個葉子分別為根,建20棵trie樹,再把20棵trie樹合成一棵。這樣,trie上乙個到某個祖先的路徑構成了所有的子串。可能重複 所以trie上建sam。sam的路徑條數 或者每個點的len i len fa i ...