51nod 1526 分配筆名(字典樹 貪心)

2022-08-31 03:39:10 字數 985 閱讀 3165

題意:

班裡有n個同學。老師為他們選了n個筆名。現在要把這些筆名分配給每乙個同學,每乙個同學分配到乙個筆名,每乙個筆名必須分配給某個同學。現在定義筆名和真名之間的相關度是他們之間的最長公共字首。設筆名為a,真名為b,則他們之間的相關度為lcp(a,b)。那麼我們就可以得到匹配的質量是每乙個同學筆名和真名之間相關度的和。

現在要求分配筆名,使得匹配質量最大。

題解:對於真名建立乙個字典樹,然後每個筆名在字典樹上打乙個標記

然後就變成了貪心,每個點的標記看是否能被字典樹上的單詞消掉,不能消,就讓標記往上走即可。

這裡。。有一組深度特別深的資料

dfs會記憶體超限,所以加了個特判(實際上。。應該用非遞迴的形式寫比較好)

#include #include 

#include

#include

using

namespace

std;

const

int maxn = 8e5 + 1

;int trans[maxn][26

], v[maxn], lab[maxn];

inttot;

long

long

ans;

void insert(char *s)

v[x]++;

}void change(char *s)

lab[x]++;

}void dfs(int x, int

d)

for(int i = 0; i < 26; i++)

if(v[x] >=lab[x])

else

}int

n;char

str[maxn];

intmain()

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

dfs(

0, 0

); cout

return0;

}

51nod 1526 分配筆名

傳送門 trie樹。首先建立trie樹,如果是名字,打標記 1,如果是筆名,打標記 1 然後做貪心爆搜,如果當前節點標記之和與兒子節點標記之和不同,則貪心選擇min乘上depth,答案一定是最優的。資料有一組要深搜80萬層,要加特判。include include include include i...

11 2 分配記憶體

這篇主要說一說c語言中幾個分配記憶體的函式 malloc calloc 和free 內容在書12.4章.c語言可以通過庫函式分配和管理記憶體.下面的 都為變數分配了一些記憶體.float f char str this is a string int arr 100 靜態資料在程式載入記憶體時分配記...

RQNOJ 140 分配時間

小王參加的考試是幾門科目的試卷放在一起考,一共給t分鐘來做。他現在已經知道每門科目花的時間和得到的分數的關係,還有寫名字要的時間 他寫自己的名字很慢 請幫他算一下他最高能得幾分。總分一定時,第一門科目成績盡量高,第一門科目成績也一樣時,第二門科目成績盡量高 以次類推。如果放棄某一門的考試 花的時間為...