标签:margin inpu strong find code ted line mis 自己
分析:一開始是用递归做的,没做出来。于是就换了如今的数组。即,把每个输入的字符串都存入二维数组中,然后创建字典树。输入和创建完成后,開始查找。
事实上一開始就读错题目了,题目要求字符串是由其它两个输入的字符串组成的前后缀,自己根本没有推断前缀是否满足。就直接推断后缀,一直想不通自己哪里错了,非常羞愧,水平还是不行。
查找分为前缀查找和后缀查找。事实上两个函数基本差点儿相同的。以下放代码。
#include <cstdio> #include <cstring> #include <iostream> using namespace std; struct trie { trie *next[26]; int v; //字符同样的个数 trie() { memset(next,NULL,sizeof(next)); v=1; } }; trie *root=new trie(); char s[50001][101]; void creat_trie(char *str) { int i,id; trie *p; for(p = root,i=0;str[i]; ++i) { id = str[i]-'a'; if(p->next[id] == NULL) { p->next[id] = new trie(); } p = p->next[id]; } p->v = -1; } int find_trie(char *str) { int i=0,j,id; trie *p = root; for(;*str != '\0';) { id= *str - 'a' ; if (p->next[id] != NULL) { p = p->next[id]; if(p->v == -1 && *(str+1) == '\0') return 1; str++; } else return 0; } return 0; } int find(char *str) { trie *p = root; int m; for (;*str != '\0';) { m = *str - 'a'; p = p->next[m]; if(p != NULL) { if (p->v == -1 && find_trie(str+1)) { return 1; } str++; } else return 0; } return 0; } int main() { int N,n,i=0,j,t,m,flag=0; int a,b,c,d,k; int sum; trie *p; while (gets(s[i]),s[i][0] != '\0')//,s[i][0] != '\0' { creat_trie(s[i++]); } for (j=0;j<i;j++) { if (find(s[j])) { puts(s[j]); } } return 0; }
代码2:map容器
#include <iostream> #include <map> #include <cstring> using namespace std; map <string,int> m; string s[50005]; int main() { int k=-1; while(cin>>s[++k]) { m[s[k]] = 1; } for(int i=0;i<=k;i++) { int len = s[i].length(); for(int j=1;j<len;j++) { string s1(s[i],0,j); //从0開始的j个数 string s2(s[i],j); //从j開始(不包含)一直到结尾 if(m[s1] == 1 && m[s2] == 1) { cout<<s[i]<<endl; break; } } } return 0; }
a ahat hat hatword hziee word
ahat hatword
HDU 1247 Hat’s Words (字典树 && map)
标签:margin inpu strong find code ted line mis 自己
原文地址:http://www.cnblogs.com/mfmdaoyou/p/6707158.html