HDU1247 Hat’s Words

来源:互联网 发布:金方圆数控折弯机编程 编辑:程序博客网 时间:2024/05/20 22:39

PS:  Trie树的应用。

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <vector>using namespace std;const int maxn = 50010;const int MAX = 200;//2014-04-05 Accepted124715MS7368K2121 BC++Achiberxstruct node {    int v;    node* next[26];};node* root;int cnt[MAX];void Insert(char* str) {    node* now = root;    int len = strlen(str);    for(int i = 0; i < len; i++) {        int u = str[i]-'a';        if(now->next[u]==NULL) {            node* t = new node;            t->v = 0;            memset(t->next, NULL, sizeof(t->next));            now->next[u] = t;        }        now = now->next[u];    }    now->v = -1; // represent the ending of word.}bool query2(char* str) {    node* now = root;    int len = strlen(str);    for(int i = 0; i < len; i++) {        int u = str[i]-'a';        if(now->next[u] != NULL) {            now = now->next[u];            if(i==len-1 && now->v ==- 1) return true;        } else  return false;    }    return false;}bool query(char* str) {    vector<int> v;    v.clear();    node* now = root;    int len = strlen(str);    for(int i = 0; i < len; i++) {        int u = str[i]-'a';        if(now->next[u] != NULL) {            now = now->next[u];            if(now->v==-1) {                v.push_back(i);            }        } else break;    }    if(!v.size()) return false;    char remain[100];    memset(remain, '\0', sizeof(remain));    for(int i = 0; i < (int)v.size(); i++) {        int st = v[i];        strcpy(remain, str+st+1);        if(!strlen(remain)) return false;        bool result = query2(remain);        if(result) return true;        else continue;    }    return false;}char lib[maxn+5][100];int main(){    char str[100];    int idx = 0;    root = new node;    root->v = 0;    memset(root->next, NULL, sizeof(root->next));    while(gets(str) && str[0]) {        Insert(str);        strcpy(lib[idx++], str);    }    for(int i = 0; i < idx; i++) {        bool res = query(lib[i]);        if(res) puts(lib[i]);    }    return 0;}

0 0
原创粉丝点击