HDU 5469 Antonidas(樹上的字串匹配/搜尋)
題目連結:傳送門
題意:
給定一棵樹,每一個節點有一個字元,給定一個目標字串,判斷能否在這棵樹上找到一條路徑使得這條路徑組成的字串等於目標串。
分析:
搜尋+剪枝,首先預處理出以1為根這個節點離葉子節點的最大距離,然後根據目標串匹配剩下的長度與這個最大深度作比較作為剪枝的依據。
程式碼如下:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e4+10;
int n,len;
char mood[maxn];
char str[maxn];
struct Graph{
vector <int >vc[maxn];
int height[maxn];
bool vis[maxn];
int par[maxn];
void init(){
for(int i=0;i<maxn;i++)
vc[i].clear();
memset(height,0,sizeof(height));
memset(vis,0,sizeof(vis));
}
void add(int u,int v){
vc[u].push_back(v);
vc[v].push_back(u);
}
void get_height(int u){
height[u]=1;
vis[u]=1;
for(int i=0;i<vc[u].size();i++){
int v = vc[u][i];
if(!vis[v]){
get_height(v);
par[v]=u;
height[u] = max(height[u],height[v]+1);
}
}
}
bool find_str(int u,int id,int remain){
vis[u]=1;
if(id>len) return 1;
if(height[u]>remain){
for(int i=0;i<vc[u].size();i++){
int v = vc[u][i];
if(!vis[v]&&mood[v]==str[id]){
if(find_str(v,id+1,remain-1))
return 1;
}
}
}
else{
if(!vis[par[u]]&&mood[par[u]]==str[id])
return find_str(par[u],id+1,remain-1);
}
return 0;
}
}G;
int main()
{
int t,cas=1;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
G.init();
for(int i=1;i<n;i++){
int u,v;
scanf("%d%d",&u,&v);
G.add(u,v);
}
scanf("%s",mood+1);
scanf("%s",str+1);
G.get_height(1);
for(int i=1;i<=n;i++)
cout<<i<<": "<<G.height[i]<<endl;
len = strlen(str+1);
int tag=1;
printf("Case #%d: ",cas++);
for(int i=1;i<=n;i++){
if(mood[i]==str[1]){
memset(G.vis,0,sizeof(G.vis));
if(G.find_str(i,2,len-1)){
tag=0;
break;
}
}
}
if(tag) puts("Impossible");
else puts("Find");
}
return 0;
}
相關文章
- [PY3]——字串的分割、匹配、搜尋方法總結字串
- 字串搜尋字串
- 【KMP求字串匹配次數】 hdu 1686KMP字串匹配
- HDU 4620 Fruit Ninja Extreme(搜尋)UIREM
- 【技術點】計算機基礎演算法——排序 & 搜尋 & 字串匹配計算機演算法排序字串匹配
- hdu 3973 字串hash+線段樹字串
- 二叉搜尋樹
- HDU5348 MZL's endless loop (搜尋)OOP
- HDU5716 : 帶可選字元的多字串匹配字元字串匹配
- 使用grep搜尋多個字串字串
- 【資料結構】搜尋樹資料結構
- HDU4620 Fruit Ninja Extreme(搜尋+剪枝)UIREM
- 二分搜尋樹元素的插入
- 二叉搜尋樹的操作集
- 二叉搜尋樹的結構
- kmp字串匹配,A星尋路演算法KMP字串匹配演算法
- Mac上神奇的內建搜尋引擎——Spotlight(聚焦搜尋)Mac
- 【KMP求字串第一個匹配位置】hdu 1711KMP字串
- Leetcode 700. 二叉搜尋樹中的搜尋(DAY 2)LeetCode
- Python資料結構——二叉搜尋樹的實現(上)Python資料結構
- jQuery的搜尋關鍵詞自動匹配外掛jQuery
- HDU 1241Oil Deposits(簡單搜尋題)
- 96. 不同的二叉搜尋樹
- leetcode 700. 二叉搜尋樹中的搜尋 思考分析LeetCode
- Day20 | 654.最大二叉樹 、 617.合併二叉樹 、 700.二叉搜尋樹中的搜尋 98.驗證二叉搜尋樹二叉樹
- 解決jive搜尋結果中的中文搜尋字串高亮度顯示的方法字串
- 二叉搜尋樹的python實現Python
- [CareerCup] 18.8 Search String 搜尋字串字串
- javascript實現二叉搜尋樹JavaScript
- 有序表和搜尋二叉樹二叉樹
- Avalonia下拉可搜尋樹(TreeComboBox)
- 資料結構中的樹(二叉樹、二叉搜尋樹、AVL樹)資料結構二叉樹
- 強化學習(十八) 基於模擬的搜尋與蒙特卡羅樹搜尋(MCTS)強化學習
- 【搜尋引擎】 PostgreSQL 10 實時全文檢索和分詞、相似搜尋、模糊匹配實現類似Google搜尋自動提示SQL分詞Go
- 精通 Linux 上的檔案搜尋Linux
- 改造layui-樹(tree)元件支援樹的關鍵字搜尋操作UI元件
- 二叉搜尋樹和二叉樹的最近公共祖先二叉樹
- 深度學習在視覺搜尋和匹配中的應用深度學習視覺