POJ2001 Shortest Prefixes

来源:互联网 发布:不需要域名的企业邮箱 编辑:程序博客网 时间:2024/05/24 05:02

题目链接:http://poj.org/problem?id=2001

另一种字典树的写法……

#include <iostream>#include <cstdio>#include <cstring>using namespace std;struct trie{    int ch[100100][30];    int num[100100];    int sz;    void reset(){        memset(ch[0], 0, sizeof(ch[0]));        memset(num, 0, sizeof(num));        sz = 1;    }    int idx(char c){        return c - 'a';    }    void insert(string s){        int u = 0, n = s.size();        for (int i = 0; i < n; i++){            int c = idx(s[i]);            if (!ch[u][c]){                ch[u][c] = sz;                memset(ch[sz], 0, sizeof(sz));                num[sz] = 1; sz += 1;            }            else num[ch[u][c]] += 1;            u = ch[u][c];        }    }    void print(string s){        int u = 0, n = s.size();        for (int i = 0; i < n; i++){            int c = idx(s[i]);            putchar(s[i]);            if (num[ch[u][c]] == 1) return;            u = ch[u][c];        }    }}t;string s[2010];int main(){    //freopen("in.txt", "r", stdin);    //freopen("out.txt", "w", stdout);    int n = 0;    t.reset();    while (cin >> s[n]) t.insert(s[n++]);    for (int i = 0; i < n; i++){        cout << s[i] << " ";        t.print(s[i]);        printf("\n");    }    return 0;}


#include <iostream>#include <cstdio>#include <cstring>using namespace std;struct trie{    int num;    int next[30];    int init(){        num = 1;        memset(next, -1, sizeof(next));        return 0;    }}tree[100100];int sz = 1;const int rt = 0;int idx(char c){    return c - 'a';}void insert(string s){    int p = rt, n = s.size();    for (int i = 0; i < n; i++){        int v = idx(s[i]);        if (tree[p].next[v] == -1){            tree[p].next[v] = sz;            tree[sz].init();            sz += 1;        }        else tree[tree[p].next[v]].num += 1;        p = tree[p].next[v];    }}void print(string s){    int p = rt, n = s.size();    for (int i = 0; i < n; i++){        int v = idx(s[i]);        putchar(s[i]);        if (tree[tree[p].next[v]].num == 1) return;        p = tree[p].next[v];    }}void init(){    sz = 1;    tree[0].init();}string s[2010];int main(){    init();    int n = 0;    while(cin >> s[n]) insert(s[n++]);    for (int i = 0; i < n; i++){        cout << s[i] << " ";        print(s[i]);        printf("\n");    }    return 0;}


原创粉丝点击