題目傳送
閱讀理解題題意解釋可以看這位大佬的部落格。
發現求字尾與倒序求字首是等價的,而找字首自然就想到了trie樹。將所有字串翻轉後再建入trie樹中,再對每乙個字串翻轉後從trie樹中找字首,就能找到乙個字串的所有字尾了。
由第三種情況知我們要想最小化總代價,則最小化乙個字串與最靠近它的字尾間的距離應該也是乙個要考慮的因素。其實乙個串最近的字尾其實一定是它的所有字尾中長度最大的,因為它的字尾中長度短的也一定是長度大的字尾,並且還要避免第一種情況的出現(即序列在乙個字串後面的串中不能有這個字串的字尾)。故我們只要知道每個字串最長的字尾就好。若乙個串是另乙個串的字尾,則可以從這個串向另乙個串連一條有向邊,則最終會形成乙個森林。
這時避免了第一種情況後,還有兩種情況。我們做了這麼多題,知道一種情況總應該比多種情況好做。故考慮將兩種情況轉化為一種。發現如果我們在所有題目給出的字串的基礎上再加入乙個處於序列第0個位置的空串,那麼第二種情況也就轉化為了第三種情況,並且對答案沒有影響。這種轉化對於當前的森林,只要再建個標號為0的空串節點連向所有樹的根就好了。
此時問題就轉化為:給樹的節點編號,要求父親節點的序號比兒子節點小,且根節點的序號為0,並使得兒子節點的編號減父親節點編號的差的和最小,求最小的和。考慮怎麼選點編號。作者一開始也懵的一逼於是看了看這位大佬部落格關於選法的證明部分(「考慮建出……q.e.d」)終於明白如果選到了乙個點,就要一口氣把它的子樹都選了,並且優先選子樹大小最小的兒子。dfs就搞定了呀。至於對某個點的兒子從子樹大小小的往大的選,可以用堆維護。
具體實現請看**:
1 #include2 #include3 #include4 #include5ac**6#define max(a,b) ((a)>(b)?(a):(b))78
using
namespace
std;910
const
int n=100005,len=510005;11
12int tree[510005][26
],cnt,n,l,dfs;
13int ed[len],in
[n],lst[n],to[n],nxt[n],ecnt,dfn[n];
1415
long
long
siz[n],ans;
1617
string
word[n];
1819
char
ch;20
21 inline int
read()
2229
30 inline void getstring(string &a)
3139
40 inline void insert(const
string &a,int
j)41
51 ed[now]=j;52}
5354 inline void addedge(int u,int
v)55
6061 inline int fin(const
string &a)
6274
return
ret;75}
7677
void dfssiz(int
u)7885}
8687
struct
nodehead;
9091 inline bool
operator
< (const node &a,const node &b)
9295
96void dfsans(int
u)97
);
102}
103while(!hep.empty())
104111
}112
113int
main()
114121
intu;
122for(int i=1;i<=n;++i)
123130
}131
for(int i=1;i<=n;++i)
132if(!in[i])//
沒有入度的點就是森林中樹的根
133 addedge(0
,i);
134 dfssiz(0);//
求一下每個點的子樹大小。
135 dfsans(0);//
統計答案。
136 printf("
%lld
",ans);
137return0;
138 }
洛谷P3293 SCOI2016 美味
一家餐廳有 n 道菜,編號 1.n 大家對第 i 道菜的評價值為 ai 1 i n 有 m 位顧客,第 i 位顧客的期望值為 bi,而他的偏好值為 xi 因此,第 i 位顧客認為第 j 道菜的美味度為 bi xor aj xi xor 表示異或運算。第 i 位顧客希望從這些菜中挑出他認為最美味的菜,...
洛谷P3292 SCOI2016 幸運數字
a 國共有 n 座城市,這些城市由 n 1 條道路相連,使得任意兩座城市可以互達,且路徑唯一。每座城市都有乙個幸運數字,以紀念碑的形式矗立在這座城市的正中心,作為城市的象徵。一些旅行者希望遊覽 a 國。旅行者計畫乘飛機降落在 x 號城市,沿著 x 號城市到 y 號城市之間那條唯一的路徑遊覽,最終從 ...
洛谷P3293 SCOI2016 美味(主席樹)
傳送門 據說這題做法叫做可持久化trie樹?然而我並不會 首先考慮一下貪心,從高位到低位列舉,如果能選1肯定比選0優 假設已經處理到了 b 的第 i 位,為1 為0的話同理就不說了 那麼只有當 a j x 的第 i 位為0時才能讓答案的第 i 位為 1 考慮把 x 的影響去掉。如果當前的答案是 an...