有點類似樹形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 ...