1. 程式人生 > >STL MAP使用注意事項

STL MAP使用注意事項

Hat’s Words


A hat’s word is a word in the dictionary that is the concatenation of exactly two other words in the dictionary. 
You are to find all the hat’s words in a dictionary. 
InputStandard input consists of a number of lowercase words, one per line, in alphabetical order. There will be no more than 50,000 words. 
Only one case. 
OutputYour output should contain all the hat’s words, one per line, in alphabetical order. Sample Input
a
ahat
hat
hatword
hziee
word

Sample Output

ahat
hatword

這題目可以用字典樹做:

#include <iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#define MAX 26

using namespace std;

typedef struct TrieNode                     //Trie結點宣告
{
    bool isStr;                            //標記該結點處是否構成單詞
    struct TrieNode *next[MAX];            //兒子分支
}Trie;

void insert(Trie *root,const char *s)     //將單詞s插入到字典樹中
{
    if(root==NULL||*s=='\0')
        return;
    int i;
    Trie *p=root;
    while(*s!='\0')
    {
        if(p->next[*s-'a']==NULL)        //如果不存在,則建立結點
        {
            Trie *temp=(Trie *)malloc(sizeof(Trie));
            for(i=0;i<MAX;i++)
            {
                temp->next[i]=NULL;
            }
            temp->isStr=false;
            p->next[*s-'a']=temp;
            p=p->next[*s-'a'];
        }
        else
        {
            p=p->next[*s-'a'];
        }
        s++;
    }
    p->isStr=true;                       //單詞結束的地方標記此處可以構成一個單詞
}

int search(Trie *root,const char *s)  //查詢某個單詞是否已經存在
{
    Trie *p=root;
    while(p!=NULL&&*s!='\0')
    {
        p=p->next[*s-'a'];
        s++;
    }
    return (p!=NULL&&p->isStr==true);      //在單詞結束處的標記為true時,單詞才存在
}
int search1(Trie *root,const char *s)  //查詢某個單詞是否已經存在
{
    Trie *p=root;
    while(p!=NULL&&*s!='\0')
    {
        if(p->isStr)//說明該單詞的某個字首是一個單詞
            if(search(root,s))//說明該單詞去掉字首後仍然是一個單詞
                return 1;
        p=p->next[*s-'a'];
        s++;
    }
    return 0;      //
}
void del(Trie *root)                      //釋放整個字典樹佔的堆區空間
{
    int i;
    for(i=0;i<MAX;i++)
    {
        if(root->next[i]!=NULL)
        {
            del(root->next[i]);
        }
    }
    free(root);
}
char s[50005][20];
int main()
{
    Trie *root = (Trie *)malloc(sizeof (Trie));
    for(int i=0;i<MAX;i++)
        root->next[i] = NULL;
    root->isStr = false;
    int cnt = 0;
    while(~scanf("%s",s[cnt]))
    {
        insert(root,s[cnt++]);
    }
    for(int i=0;i<cnt;i++)
    {
        if(search1(root,s[i]))
            printf("%s\n",s[i]);
    }
    return 0;

}

也可以用 STL 做,但是在使用 set 的find方法查詢某個單詞的時候會出問題,不停地WA 。只能改成MAP,但是MAP也是坑。用的時候要注意
#include <iostream>
#include <string>
#include <map>
using namespace std;
map<string, int>m;
int main() {
	string str;
	m.clear();
	while (cin >> str) m[str] = 1;
	for (map<string, int>::iterator it = m.begin(); it != m.end(); it++)
		if (it->second)//這句話,必須加上。否則就WA,但是set也可以實現但是不能判斷,find函式有點問題。因此能用set就換成MAP吧。然而不造為啥。。
for (int i = 1; i < (it->first).size(); i++) if (m[(it->first).substr(0, i)] == 1 && m[(it->first).substr(i)] == 1) { cout << it->first << endl; break; } return 0; }