字典樹中根到每個結點對應原串集合的乙個字首,這個字首由路徑上所有轉移邊對應的字母構成。我們可以對每個結點維護一些需要的資訊,這樣即可以去做很多事情。
#include usingnamespace
std;
namespace
trie
};node *root;
node pool[
1000005
];
int ind=0
; node*newnode()
void
clear()
void insert(string
s) }
int query(string
s)
return pos->val;
}string str[10005
];
void
solve()
int flag=0
;
for(int i=1;i<=n;i++)
}if(flag) cout<<"no"
yes"
<}
}int
main()
0-1 trie通常用於異或相關的問題,思路是記錄所有01串後,我們找最大異或和的時候可以從高位到低位貪心,此時trie發揮的作用就是在當前字首已經選擇的情況下,能使得正在考慮位異或為1的字尾是否存在。
#include usingnamespace
std;
namespace
trie
};node *root;
node pool[
4000005
];int
ind;
node *newnode()
void insert(int
x) }
int query(int
x)
return
ans;
}int a[1000005
];void
solve()
} //
namespace trie
intmain()
看到這個算式我們很容易想到字首和轉化。問題轉化為求s[r1]^s[l1-1] + s[r2]^s[l2-1]最大。
由於要r1
max
#include usingnamespace
std;
namespace
trie
};node *root;
node pool[
8000005
];int
ind;
node *newnode()
void insert(int
x) }
int query(int
x)
return
ans;
}int a[1000005], pre[1000005], suf[1000005
];void
solve()
} //
namespace trie
intmain()
和前面那題一樣
#include usingnamespace
std;
namespace
trie
};node *root;
node pool[
1000005
];int ind = 0
;node *newnode()
void
clear()
void insert(string
s) }
int query(string
s)
return pos->val;
}string str[10005
];bool solve(int
t) --n;
if (n <= 0
)
return
false
;
int flag = 0
;
for (int i = 1; i <= n; i++)
}if(flag)
cout
<< "
set
"<< t << "
is not immediately decodable
"
cout
<< "
set
"<< t << "
is immediately decodable
"
true;}
} //
namespace trie
intmain()
我們記錄u[i]表示文章的每乙個字首s[1..i]是否可被理解。做乙個類似dp的處理即可。
剛開始忘記傳引用t了半天……
#include usingnamespace
std;
char buf[1000005
];void readstr(string &tar)
int __cnt = 0
;namespace
trie
};node *root;
node pool[
5000005
];int u[1000005
];int ind = 0, ans = 0
;node *newnode()
void
clear()
void insert(string &s)
pos->val++;
}void query(string &s, int
start)
}string str[1005
];string
art;
void
solve()
for (int i = 1; i <= m; i++)
cout
<< ans <}
}}
//namespace trie
intmain()
對資訊建trie,仍然是在每個串的結束點上打標記。結果就等於把密碼串丟上去跑,跑的路徑上的標記和,加上最終停在的結點(如果整個密碼串都成功匹配)的子樹的標記和。前乙個直接記錄,後乙個用樹上字首和預處理一下即可。
#include usingnamespace
std;
namespace
trie
};node *root;
node pool[
1000005
];int ind = 0
;node *newnode()
void
clear()
void insert(int
len)
pos->val++;
}void dfs(node *p)
int query(int
len)
pos = pos->ch[si];
}return ans + pos->sum;
}string str[10005
];void
solve()
dfs(root);
for (int i = 1; i <= n; i++)
}}
//namespace trie
intmain()
樹上字首異或和以後直接轉化為兩點最大異或和。其實用尤拉序也可以。
#include usingnamespace
std;
namespace
trie
};node *root;
node pool[
4000005
];
intind;
node*newnode()
void insert(int
x) }
int query(int
x)
return
ans;
}int a[1000005
];
void solve(int
n) }
int n,vis[1000005
];vector
int,int> > g[1000005
];void dfs(int
p) }
}int
main()
dfs(1);
trie::solve(n);
}
一本通學習筆記 樹鏈剖分
loj上只掛了兩個無重的題,本來心想水一下,結果被sdoi2011染色那題卡了一發。儘管這題之前做過,但實現很不優美。今天wa的第一發一開始測樣例就掛了,強行除錯半天交上去一分沒有。後來仔細想了想怎樣寫比較清楚 儘管看起來好像有點冗餘 寫好以後一路順風一發就過。從這裡也有點感悟吧。include d...
一本通學習筆記 最短路徑
最短路徑常用演算法有dijkstra和spfa。spfa支援負數權重,但容易被毒瘤資料卡。想讓spfa跑快點可以加入乙個小優化 用deque代替queue,然後在push的時候分類,如果比當前front的dis要小就push front,否則push back。最短路計數和次短路問題仿照普通dp處理...
一本通 Trie字典樹
phone list includeusing namespace std const int n 1e5 5 int t,n,tot,c n 10 char s 10 bool ans,bo n void clear bool insert bo u 1 return flag int main ...