字典樹(strcmp()函式,uva 11732)

2021-07-25 08:44:02 字數 1104 閱讀 8792

有點類似樹形dp,fa[u]代表u節點的父節點,說val[u]表示u這個節點有多少個字串走過,因此在這個節點的比較總次數=val[u]*(val[u]-1)+val[u]*(val[fa[u]]-val[u])。

值得注意的是,在其他節點中val[u]*(val[u]-1)並不會重複計算,而val[u]*(val[fa[u]]-val[u])卻被再計算一次。

所以最後答案就是ans=∑val[u]*(val[u]-1)+(∑val[u]*(val[fa[u]]-val[u]))/2。

對字典樹dfs累加答案即可。

其中val[u]*(val[u]-1)表示當val[u]個字串這個位相等時,需要的總比較次數。(s[i]==t[i]和s[i]=='\0'各有一次比較)

而val[u]*(val[fa[u]]-val[u])/2表示val[u]個字串的這個位和(val[fa[u]]-val[u])

個字串的這個位不相等時,需要的總比較次數(只需要s[i]==t[i]

一次比較),其中val[u]

就是當前節點經過的字串總數,而(val[fa[u]]-val[u])

表示當前節點的所有兄弟節點經過的字串總數。

由於'\0'也需要比較,所以'\0'需要被當成字串的一部分,因此自己需要另外設定乙個值作為字串結尾的哨兵,比如說-1。

根節點是所有字串都會走過的節點,而且是乙個虛節點,所以不需要計算比較次數,特判一下就好。

**#include#define maxn 4000010

#define size 63

using namespace std;

int ch[maxn][size];

int val[maxn],sz;

int fa[maxn];

void init()

int idx(char c)

void insert(char* s)

fa[ch[u][id]]=u;

u=ch[u][id];

}}int n;

char str[1010];

int kase;

long long ans;

void dfs(int u)

for(int i=0;i

UVA 11732 鏈式字典樹

給一些字串,問如果使用strcmp函式對這些字串兩兩比較,需要進行多少次字元比較。strcmp函式在題目中已給出,如果字元相等,則還需要將該字元與 0 進行比較 鏈式字典樹我自己的叫法,網上大多數題解都把這種字典樹叫做左兒子,右兄弟的字典樹,但是這種叫法感覺會引起誤解。一開始我以為右兄弟是根的兄弟,...

c sort函式 strcmp函式

sort函式 標頭檔案 algorithm 功能 排序 預設是公升序 如 b 100 sort b,b 100 可以自己定義cmp比較函式來決定sort函式的比較規則。include include include include using namespace std struct gg 1000...

strcmp函式實現

功能 比較字串s1和s2大小。一般形式 int strcmp 字串1,字串2 說明 當s1s2時,返回 1 即兩個字串自左向右逐個字元相比 按ascii值大小相比較 直到出現不同的字元或遇 0 為止。include using namespace std int strcmp const char ...