字典树 VS STL
本是字典树问题,但用容器巧妙解决了... 所以说容器真是个好东西。。。
a ahat hat hatword hziee word
ahat hatword法1:容器哈希:#include<iostream> #include<map> #include<string> #include<vector> using namespace std; int main() { map<string , int> mm; vector<string > vec; char str[1000]; int i,j,k; while(scanf("%s",str)!=EOF) { vec.push_back(string(str)); mm[string (str)]++; } for(j=0;j<vec.size();j++) { string k=vec[j]; if(k.size()>=2) { string a="",b=""; for(i=0;i+1<k.size();i++) { a+=k[i]; b=k.substr(i+1); if(mm[a]&&mm[b]) { cout<<k<<endl; break; } } } } return 0; }
法2:map string#include <iostream> #include <string> #include <map> using namespace std; map < string , int > mp; string str[50005]; int main () { int n = 0; while ( cin >> str[n] ) mp[ str[n++] ] = 1; for ( int i = 0; i < n; ++ i ) { unsigned len = str[i].size (); for ( unsigned j = 1; j < len; ++ j ) { string s1 ( str[i], 0, j ); string s2 ( str[i], j ); if ( mp[s1] == 1 && mp[s2] == 1 ) { cout << str[i] << endl; break; } } } return 0; }
法3:字典树/*hdu 1247 Hat's word 字典树 2011.10.16*/ #include <iostream> #include<cstring> #define MAX 26 using namespace std; typedef struct Trie_Node { bool isWord; struct Trie_Node *next[MAX]; }Trie; char s[50000][50]; void insert(Trie *root,char *word) { Trie *p=root; while(*word!='\0') { if(p->next[*word-'a']==NULL) { Trie *temp=(Trie *)malloc(sizeof(Trie)); for(int i=0;i<MAX;i++) { temp->next[i]=NULL; } temp->isWord=false; p->next[*word-'a']=temp; } p=p->next[*word-'a']; word++; } p->isWord=true; } bool search(Trie *root,char *word) //查找单词是否存在 { Trie *p=root; for(int i=0;word[i]!='\0';i++) { if(p==NULL||p->next[word[i]-'a']==NULL) return false; p=p->next[word[i]-'a']; } return p->isWord; } void del(Trie *root) //释放空间 { for(int i=0;i<MAX;i++) { if(root->next[i]!=NULL) { del(root->next[i]); } } free(root); } int main(int argc, char *argv[]) { int i,j; int count=0; char str[50]; Trie *root=(Trie *)malloc(sizeof(Trie)); for(i=0;i<MAX;i++) { root->next[i]=NULL; } root->isWord=false; while(scanf("%s",str)!=EOF) { strcpy(s[count++],str); insert(root,str); } for(i=0;i<count;i++) { for(j=1;j<=strlen(s[i])-1;j++) { char temp1[50]={'\0'}; char temp2[50]={'\0'}; strncpy(temp1,s[i],j); strncpy(temp2,s[i]+j,strlen(s[i])-j); if(search(root,temp1)&&search(root,temp2)) { printf("%s\n",s[i]); break; } } } del(root); return 0; }