zrq495
www.zrq495.com

Trie树 + 暴力。

代码如下:

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<cstdlib>
  5 
  6 using namespace std;
  7 
  8 char s[50002][100];
  9 
 10 typedef struct node
 11 {
 12     int flag;
 13     node *next[26];
 14 }node;
 15 
 16 node *newnode()   //新节点
 17 {
 18     int i;
 19     node *p=new node;
 20     p->flag=0;
 21     for (i=0; i<26; i++)
 22         p->next[i]=NULL;
 23     return p;
 24 }
 25 
 26 void insert(node *rt,char *str)    //插入新节点
 27 {
 28     int i;
 29     node *p=rt;
 30     int t, len=strlen(str);
 31     for (i=0; i<len; i++)
 32     {
 33         t=str[i]-'a';
 34         if (p->next[t] == NULL)
 35             p->next[t]=newnode();
 36         p=p->next[t];
 37     }
 38     p->flag=1;
 39 }
 40 
 41 int search(node *rt, char s[])    //查找
 42 {
 43     node *p=rt;
 44     int i, t, len=strlen(s);
 45     for (i=0; i<len; i++)
 46     {
 47         t=s[i]-'a';
 48         if (p->next[t] == NULL)
 49             return 0;
 50         p=p->next[t];
 51     }
 52     if (p->flag == 1)
 53         return 1;
 54     return 0;
 55 }
 56 
 57 void del(node *p)     //删除trie树
 58 {
 59     int i;
 60     if (p)
 61         for (i=0; i<26; i++)
 62             if (p->next[i])
 63                 del(p->next[i]);
 64     free(p);
 65     p=NULL;
 66 }
 67 
 68 int main()
 69 {
 70     int t1, t2;
 71     int i, j, n, m, k;
 72     node *rt, *p;
 73     char ss[100], se[100];
 74     rt=newnode();
 75     i=0;
 76     while(scanf("%s%*c", s[i]) != EOF)
 77     {
 78         insert(rt, s[i]);
 79         i++;
 80     }
 81     n=i;
 82     for (i=0; i<n; i++)
 83     {
 84         t1=t2=0;
 85         m=strlen(s[i]);
 86         if (m > 1)
 87         {
 88             for (j=1; j<m; j++)    //拆成两部分
 89             {
 90                 for (k=0; k<j; k++)
 91                     ss[k]=s[i][k];
 92                 ss[k]='\0';
 93                 for (; k<m; k++)
 94                     se[k-j]=s[i][k];
 95                 se[k-j]='\0';
 96                 t1=search(rt, ss);
 97                 t2=search(rt, se);
 98                 if (t1 == 1 && t2 == 1)
 99                 {
100                     printf("%s\n", s[i]);
101                     break;
102                 }
103             }
104         }
105     }
106     del(rt);
107     return 0;
108 }
posted on 2012-08-14 14:20  zrq495  阅读(187)  评论(0编辑  收藏  举报