hdu1247 字典树或者hash
生活随笔
收集整理的這篇文章主要介紹了
hdu1247 字典树或者hash
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題意:
? ? ?給你一些串,問你哪些串是由其他兩個串連接成的。
思路:?
? ? ?給你一些串,問你哪些串是由其他兩個串連接成的。
思路:?
? ? ? 我用了兩種方法,一個是hash,hash的時候用map實現的,第二種方法是字典樹,字典樹我們枚舉每個一字符串,查找他的每一位,如果當前這一位是某個單詞的最后一個字母,那么就重新跑到樹的根節(jié)點,繼續(xù)搜,搜到最后一個字母的時候,如果當前的這個字母是某個單詞的最后一個那么就輸出當前這個,還有就是注意一點,如果找到答案就直接break,不然后可能輸出重復的,因為當前這個字符串可能被很多組合滿足,還有就是不知道題目中有沒有這樣的數據 ab abab,這樣不知道是否要輸出abab,總之不用管就AC了,估計就是沒有,要不就是題目說了我沒注意。
字典樹
#include<stdio.h> #include<string.h> #include<stdlib.h> typedef struct Tree {Tree *next[26];int mk; }Tree;Tree root;char str[50005][100];void Buid_Tree(char *str) {int len = strlen(str);Tree *p = &root ,*q;for(int i = 0 ;i < len ;i ++){int id = str[i] - 'a';if(p -> next[id] == NULL){q = (Tree *) malloc(sizeof(Tree));q -> mk = 0;for(int j = 0 ;j < 26 ;j ++)q -> next[j] = NULL;p -> next[id] = q;p = p -> next[id];}else p = p -> next[id];}p -> mk = 1; }void solve(char *str) {int len = strlen(str);Tree *p = &root;for(int i = 0 ;i < len ;i ++){int id = str[i] - 'a';p = p -> next[id];if(p == NULL) break;if(p -> mk){Tree *pp = &root;int mkk = 0;for(int j = i + 1 ;j < len && !mkk;j ++){int idd = str[j] - 'a';pp = pp -> next[idd];if(pp == NULL) mkk = 1;}if(!mkk && pp -> mk){printf("%s\n" ,str);break;}}} } int main () {for(int i = 0 ;i < 26 ;i ++)root.next[i] = NULL;int n = 0;while(~scanf("%s" ,str[++n])){Buid_Tree(str[n]);}for(int i = 1 ;i <= n ;i ++)solve(str[i]);return 0; }hash #include<iostream> #include<map> #include<string> using namespace std;string str[55000]; map<string ,int>hash;int main () {int n = 0 ,i;hash.clear();while(cin >> str[++n]){hash[str[n]] = 1;}for(i = 1 ;i <= n ;i ++){int len = str[i].size();for(int k = 1 ;k < len ;k ++){string s1(str[i] ,0 ,k);string s2(str[i] ,k ,len);if(hash[s1] && hash[s2]){cout<<str[i]<<endl;break;}}}//getchar();getchar(); return 0; }
總結
以上是生活随笔為你收集整理的hdu1247 字典树或者hash的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hdu1251 hash或者字典树
- 下一篇: hdu2846 字典树(带id的)