hihocoder 1107 : Shortest Proper Prefix
生活随笔
收集整理的這篇文章主要介紹了
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的前綴。
由此我們可以得到一個簡單的算法:
#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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [JEEWX问题修复] JeeWX开源版
- 下一篇: hdu 5418(状态压缩dp+Floy