字串處理 Tire樹 LA3942

2022-08-05 18:15:09 字數 1107 閱讀 4096

其實trie樹並沒有聽上去那麼高階。首先它是把所有的單詞存到了一棵樹裡面,說白了,就是按照乙個單詞的字首來存。不過這棵樹不需要按照嚴格意義上的樹來了,實際上,只需要用ch[u][i]來存就好了,而ch[u][i]代表的就是整棵樹,ch[u][i]的值為樹的節點值,即時遍歷的時間戳。u代表的是當前節點值,ch[u][i]代表的是u的兒子節點中單詞'i'代表的節點值,如果ch[u][i]

= 0,那麼我們可以認為這個節點不存在,如果不等於0那麼我們認為存在。每乙個節點除了節點值(時間戳)外,還有乙個權值,我們不妨中間節點的權值附成0,單詞最後的那個字母對應的節點的權值附成-1,代表這個位置是乙個單詞。sz代表的就是當前共有的節點總數。insert函式就是插入單詞,這個也比較好寫。

大白皮上面把trie樹寫在了結構體裡面,這樣好像直接就限制了ch的範圍,應該不是以堆的形式來存了。其實完全不需要,看了上面的解釋就知道了,不過感覺還是直接定義乙個trie結構體比較好看一點。。。(然而並沒有什麼卵用)。就用大白皮上面的那道la_3942為例吧。下面是**。

#include #include #include #include #include #include #define for(i,x,y)  for(int i = x;i < y;i ++)

#define ifor(i,x,y) for(int i = x;i > y;i --)

#define mod 20071027

using namespace std;

int ch[4005*105][26],sz,val[4005*105],len[300005],cnt;

int dp[300005];

char s[300005];

void init()

void insert(char* str,int v)

u = ch[u][c];

}val[u] = v;

}void find(char* str)

return ;

}int main()

n = strlen(s);

dp[n] = 1;

ifor(i,n-1,-1)

}printf("%d\n",dp[0]);

}return 0;

}

394 字串解碼

給定乙個經過編碼的字串,返回它解碼後的字串。編碼規則為 k encoded string 表示其中方括號內部的 encoded string 正好重複 k 次。注意 k 保證為正整數。你可以認為輸入字串總是有效的 輸入字串中沒有額外的空格,且輸入的方括號總是符合格式要求的。此外,你可以認為原始資料不...

394 字串解碼

思路 思路一 使用棧 這種括號或者括號套括號的模式非常適合用棧來解決,設定乙個輔助棧,當遇到 的時候,開始將所有東西推到 棧中,直到遇到 時,開始取棧中的東西。取得方法 先取字元,再取數字,計算得到到的東西再壓入棧中 直到所有 都遍歷完為止 注意點 從棧中取的順序和最終生成結果得順序應該一致 cla...

394 字串解碼

注意 k 保證為正整數。你可以認為輸入字串總是有效的 輸入字串中沒有額外的空格,且輸入的方括號總是符合格式要求的。此外,你可以認為原始資料不包含數字,所有的數字只表示重複的次數 k 例如不會出現像 3a 或 2 4 的輸入。輔助棧解法 遍歷字串 s 中每個字元 c 當 c 為數字時,將數字字元轉化為...