洛谷P12238 [藍橋杯 2023 國 Java A] 單詞分類

[Problem Discription] \color{blue}{\texttt{[Problem Discription]}} [Problem?Discription]

在這里插入圖片描述
Copy from luogu.

[Analysis] \color{blue}{\texttt{[Analysis]}} [Analysis]

既然都是字符串前綴的問題了,那當然首先就應該想到 Trie \text{Trie} Trie 樹。

我們可以發現這么一個性質,如果選從根到 Trie \text{Trie} Trie 樹上某一點形成給定字符串作為前綴,那么子樹內所有的字符串都會被歸為這個類,子樹外的其它字符串都不會被歸為這個類。

于是可以想到在 Trie \text{Trie} Trie 上進行 dp \text{dp} dp。用 f u , k f_{u,k} fu,k? 表示把子樹 u u u 內的字符串分為 k k k 類的方案數。

根據上面的性質,其實這個 dp \text{dp} dp 等價于從 u u u 及其子樹中選出 k k k 個點的方案數,因而轉移方程顯然。

但是需要注意的是,如果選擇了 u u u 這個點,那么 u u u 的子樹的點都不可以被選取,不然就會有些字符串被分入兩個組中。當然,如果 k = 1 k=1 k=1,那么選擇 u u u 也是可能的合法的選擇。

另外,因為每個字符串都要被分入其中一個組,因此 k k k 不能小于等于 0 0 0

考慮清楚邊界情況就可以開始寫代碼了。

另外,由于每個節點最多也就 3 3 3 個子樹,因此沒必要寫得那么復雜,枚舉每棵子樹內選取多少個點就可以了。

時間復雜度最多 O ( N K × max ? { ∣ s ∣ } ) O(NK \times \max \{ |s| \}) O(NK×max{s})。其中 max ? { ∣ s ∣ } \max \{ |s| \} max{s} 表示字符串長度的最大值。

Code \color{blue}{\text{Code}} Code

const int mod=1e9+7;
const int N=210,M=110,L=2010;int id(char ch){switch (ch){case 'l': return 0;case 'q': return 1;case 'b': return 2;default: return -1;}
}struct Trie_Tree{int ch[L][3],ndcnt,cnt[L],child[L];bool flag[L];void init(){memset(ch,-1,sizeof(ch));memset(cnt,0,sizeof(cnt));memset(flag,false,sizeof(flag)); memset(child,0,sizeof(child));ndcnt=0;}void insert(string s){int l=s.length(),u=0;for(int i=0;i<l;i++){int c=id(s[i]);if (ch[u][c]==-1){ch[u][c]=++ndcnt;++child[u]; }++cnt[u];//統計字符串的數量 u=ch[u][c];}++cnt[u];flag[u]=true;}
}trie;int f[L][M],n,m;int dp(int u,int k){ if (trie.cnt[u]<k) return 0;if (~f[u][k]) return f[u][k];if (k<=0) return 0; if (trie.flag[u]) return k==1;int res=((k==1)?1:0);if (trie.child[u]==1){int c;if (~trie.ch[u][0]) c=trie.ch[u][0];else if (~trie.ch[u][1]) c=trie.ch[u][1];else c=trie.ch[u][2];res=(res+dp(c,k))%mod;}else if (trie.child[u]==2){int c1,c2;if (~trie.ch[u][0]){c1=trie.ch[u][0];if (~trie.ch[u][1]) c2=trie.ch[u][1];else c2=trie.ch[u][2];}else c1=trie.ch[u][1],c2=trie.ch[u][2];for(int i=1;i<k;i++)res=(res+1ll*dp(c1,i)*dp(c2,k-i)%mod)%mod;}else{for(int i=1;i<k;i++)for(int j=1;j<k-i;j++)res=(res+1ll*dp(trie.ch[u][0],i)*dp(trie.ch[u][1],j)%mod*dp(trie.ch[u][2],k-i-j)%mod)%mod;}return f[u][k]=res;
}int main(){cin>>n>>m;trie.init();for(int i=1;i<=n;i++){string s;cin>>s;trie.insert(s);}memset(f,-1,sizeof(f));printf("%d",dp(0,m));return 0;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/904282.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/904282.shtml
英文地址,請注明出處:http://en.pswp.cn/news/904282.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

pta作業中有啟發性的程序題

1 【知識點】&#xff1a;多態 函數接口定義&#xff1a; 以Student為基類&#xff0c;構建GroupA, GroupB和GroupC三個類 裁判測試程序樣例&#xff1a; #include<iostream> #include <string> using namespace std;/* 請在這里填寫答案 */int main() {const …

Scrapy框架之CrawlSpider爬蟲 實戰 詳解

CrawlSpider 是 Scrapy 框架中一個非常實用的爬蟲基類&#xff0c;它繼承自 Spider 類&#xff0c;主要用于實現基于規則的網頁爬取。相較于普通的 Spider 類&#xff0c;CrawlSpider 可以根據預定義的規則自動跟進頁面中的鏈接&#xff0c;從而實現更高效、更靈活的爬取。 Scr…

Glide 如何加載遠程 Base64 圖片

最近有個需求&#xff0c;后端給出的圖片地址并不是正常的 URL&#xff0c;而且需要一個接口去請求&#xff0c;但是返回的是 base64 數據流。這里不關心為啥要這么多&#xff0c;原因有很多&#xff0c;可能是系統的問題&#xff0c;也可能是能力問題。當然作為我們 Android 程…

004-nlohmann/json 快速認識-C++開源庫108杰

了解 nlohmann/json 的特點&#xff1b;理解編程中 “數據戰場”劃分的概念&#xff1b;迅速上手多種方式構建一個JSON對象&#xff1b; 1 特點與安裝 nlohmann/json 是一個在 github 長期霸占 “JSON” 熱搜版第1的CJSON處理庫。它的最大優點是與 C 標準庫的容器數據&#xf…

#基礎Machine Learning 算法(上)

機器學習算法的分類 機器學習算法大致可以分為三類&#xff1a; 監督學習算法 (Supervised Algorithms&#xff09;:在監督學習訓練過程中&#xff0c;可以由訓練數據集學到或建立一個模式&#xff08;函數 / learning model&#xff09;&#xff0c;并依此模式推測新的實例。…

正弦波、方波、三角波和鋸齒波信號發生器——Multisim電路仿真

目錄 Multisim使用教程說明鏈接 一、正弦波信號發生電路 1.1正弦波發生電路 電路組成 工作原理 振蕩頻率 1.2 正弦波發生電路仿真分析 工程文件鏈接 二、方波信號發生電路 2.1 方波發生電路可調頻率 工作原理 詳細過程 2.2 方波發生電路可調頻率/可調占空比 調節占空比 方波產生…

【AND-OR-~OR鎖存器設計】2022-8-31

緣由鎖存器11111111111-硬件開發-CSDN問答 重置1&#xff0c;不論輸入什么&#xff0c;輸出都為0&#xff1b; 重置0&#xff0c;輸入1就鎖住1 此時輸入再次變為0&#xff0c;輸出不變&#xff0c;為鎖住。

力扣-字符串-468 檢查ip

思路 考察字符串的使用&#xff0c;還有對所有邊界條件的檢查 spilt&#xff08;“\.”&#xff09;&#xff0c;toCharArray&#xff0c;Integer.parseInt() 代碼 class Solution {boolean checkIpv4Segment(String str){if(str.length() 0 || str.length() > 4) retur…

BC8 十六進制轉十進制

題目&#xff1a;BC8 十六進制轉十進制 描述 BoBo寫了一個十六進制整數ABCDEF&#xff0c;他問KiKi對應的十進制整數是多少。 輸入描述&#xff1a; 無 輸出描述&#xff1a; 十六進制整數ABCDEF對應的十進制整數&#xff0c;所占域寬為15。 備注&#xff1a; printf可以使用…

ARM子程序和棧

微處理器中的棧由棧指針指向存儲器中的棧頂來實現&#xff0c;當數據項入棧時&#xff0c;棧 指針向上移動&#xff0c;當數據項出棧時&#xff0c;棧指針向下移動。 實現棧時需要做出兩個決定&#xff1a;一是當數據項進棧時是向低位地址方向向上生 長&#xff08;圖a和圖b&a…

jwt身份驗證和基本的利用方式

前言 &#xff1a; 什么是jwt&#xff08;json web token&#xff09;&#xff1f; 看看英文單詞的意思就是 json形式的token 他的基本的特征 &#xff1a; 類似于這樣的 他有2個點 分割 解碼的時候會有三個部分 頭部 payload 對稱密鑰 這個就是對稱加密 頭部&am…

n8n工作流自動化平臺的實操:利用本地嵌入模型,完成文件內容的向量化及入庫

1.成果展示 1.1n8n的工作流 牽涉節點&#xff1a;FTP、Code、Milvus Vector Store、Embeddings OpenAI、Default Data Loader、Recursive Character Text Splitter 12.向量庫的結果 2.實操過程 2.1發布本地嵌入模型服務 將bge-m3嵌入模型&#xff0c;發布成滿足open api接口…

MATLAB人工大猩猩部隊GTO優化CNN-LSTM多變量時間序列預測

本博客來源于CSDN機器魚&#xff0c;未同意任何人轉載。 更多內容&#xff0c;歡迎點擊本專欄目錄&#xff0c;查看更多內容。 目錄 0 引言 1 數據準備 2 CNN-LSTM模型搭建 3 GTO超參數優化 3.1 GTO函數極值尋優 3.2 GTO優化CNN-LSTM超參數 3.3 主程序 4 結語 0 引言…

git項目遷移,包括所有的提交記錄和分支 gitlab遷移到gitblit

之前git都是全新項目上傳&#xff0c;沒有遷移過&#xff0c;因為遷移的話要考慮已有項目上的分支都要遷移過去&#xff0c;提交記錄能遷移就好&#xff1b;分支如果按照全新項目上傳的方式需要新git手動創建好老git已有分支&#xff0c;在手動一個一個克隆老項目分支代碼依次提…

Photo-SLAM論文理解、環境搭建、代碼理解與實測效果

前言&#xff1a;第一個解耦式Photo-SLAM&#xff0c;亮點和效果。 參考&#xff1a;https://zhuanlan.zhihu.com/p/715311759 全網最細PhotoSLAM的conda環境配置教程&#xff0c;拒絕環境污染&#xff01;&#xff01;-CSDN博客 1. 環境搭建 硬件&#xff1a;RTX 4090D wi…

如何使用VSCode編寫C、C++和Python程序

一、首先準備好前期工作。如下載安裝Python、VSCode、一些插件等。寫代碼之前需要先創建文件夾和文件。 二、將不同語言寫的代碼放在不同的文件夾中&#xff0c;注意命名時不要使用中文。 三、打開VSCode&#xff0c;點擊“文件”->“打開文件夾”->“daimalainxi”->…

基于不確定性感知學習的單圖像自監督3D人體網格重建 (論文筆記與思考)

文章目錄 論文解決的問題提出的算法以及啟發點 論文解決的問題 首先這是 Self-Supervised 3D Human mesh recovery from a single image with uncertainty-aware learning &#xff08;AAAI 2024&#xff09;的論文筆記。該文中主要提出了一個自監督的framework用于人體的姿態…

Leetcode刷題記錄33——二叉樹的最小深度

題源&#xff1a;https://leetcode.cn/problems/minimum-depth-of-binary-tree/description/ 題目描述&#xff1a; 思路一&#xff1a; 使用 DFS 遞歸遍歷的解法&#xff0c;每當遍歷到一條樹枝的葉子節點&#xff0c;就會更新最小深度&#xff0c;當遍歷完整棵樹后&#x…

有效的括號(20)

20. 有效的括號 - 力扣&#xff08;LeetCode&#xff09; 解法&#xff1a; class Solution { public:bool isValid(string s) {unordered_map<char, char> m {{), (}, {],[}, {}, {}};stack<char> stk;for (int i 0; i < s.size(); i) {if (s[i] ( || s[i…

電子郵件相關協議介紹

0 Preface/Foreword 1 協議介紹 電子郵件包含的主要協議&#xff1a; SMTPPOPIMAP 1.1 SMPT SMPT: Simple Mail Transfer Protocol&#xff0c;電子郵件傳輸的標準協議&#xff0c;負責將郵件從發送方傳輸到接收方郵件服務器。 1.2 POP POP&#xff1a; Post Office Protoc…