日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

hihocoder 1107 : Shortest Proper Prefix

發布時間:2025/3/16 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hihocoder 1107 : Shortest Proper Prefix 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目大意

給定N個單詞,求滿足下列條件的前綴集合S:

  • 集合中任意前綴對應的單詞數量小于等于5
  • 對于集合中任意前綴p,p的擴展前綴不屬于該集合

對于第二個條件,舉個例子來說:

假設ab對應了5個單詞,abc對應了3個單詞,abd對應了2個單詞。

因為ab對應的單詞數量少于等于5,所以ab屬于集合S。雖然abc和abd對應的單詞數量均小于等于5,但由于其為ab的擴展,所以不屬于S。

解題思路

由于本題需要詢問多個單詞的公共前綴,很顯然的是一道Trie樹的題目,關于Trie樹的講解,可以點擊這里學習。

首先我們將所有的單詞建立成一顆Trie樹,舉個例子:



對于樹上任意一個節點,表示從根到節點路徑構成的前綴,其數字表示該前綴對應的單詞數量。

題目中描述的兩個條件很容易在該Trie樹中判定:

  • 當節點數字小于等于5時,則表示該前綴是一個合法解
  • 當節點為合法解時,以它為根的子樹上其他節點都不再計入合法解

在上圖中,藍色節點表示最后屬于集合S的前綴。

由此我們可以得到一個簡單的算法:

  • 對構建好的Trie樹進行遍歷
  • 若當前節點計數小于等于5,返回1
  • 若當前結點計數大于5,遞歸對所有子樹進行遍歷,并返回統計和

  • #include<iostream> #include<cstdio> #include<cstring> using namespace std;int n,ans; char str[1000000]; struct node {struct node *next[26];int num; }Node;void add(node *root,char *s) {int len = strlen(s);node *p = root;for(int i = 0; i < len; i++){if(p->next[s[i]-'a'] == NULL){p->next[s[i]-'a'] = (node *)malloc(sizeof(node));for(int j = 0; j < 26; j++)p->next[s[i]-'a']->next[j] = NULL;p->next[s[i]-'a']->num = 0;}p = p->next[s[i]-'a'];p->num++;} }void dfs(node *root) {if(root == NULL) return;if(root->num <= 5 && root->num != 0){ans++;return;}for(int i = 0; i < 26; i++){dfs(root->next[i]);}return; }void del(node *root) {if(root == NULL) return;for(int i = 0; i < 26; i++){del(root->next[i]);free(root->next[i]);} }int main() { while(scanf("%d",&n)!=EOF){node *root = (node *)malloc(sizeof(node));for(int i = 0; i < 26; i++)root->next[i] = NULL;root->num = 0;for(int i = 1; i <= n; i++){getchar();scanf("%s",str);add(root,str);memset(str,0,sizeof(str));}ans = 0;dfs(root);printf("%d\n",ans);del(root);free(root);}return 0; }

    總結

    以上是生活随笔為你收集整理的hihocoder 1107 : Shortest Proper Prefix的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。