poj 3007 Organize Your Train part II(二叉排序树)

题目:http://poj.org/problem?id=3007

题意:按照图示的改变字符串,问有多少种。。字符串。。

思路:分几种排序的方法,,刚开始用map 超时(map效率不高啊。。),后来搜了一下题解,用二叉排序树。。。

先贴AC代码:

  1 #include <iostream>
  2 #include <cstring>
  3 #include <algorithm>
  4 using namespace std;
  5 
  6 typedef struct tree
  7 {
  8     char str[100];
  9     struct tree *l,*r;
 10 }tr;
 11 tr head;
 12 int check(char s[])
 13 {
 14     tr *q;
 15     tr *p=&head;
 16     while(p)
 17     {
 18         if(strcmp(p->str,s)>0)
 19         {
 20             if(p->l)
 21             p=p->l;
 22             else
 23             {
 24                 q=new tr;
 25                 strcpy(q->str,s);
 26                 q->l=NULL;
 27                 q->r=NULL;
 28                 p->l=q;
 29                 return 1;
 30             }
 31         }
 32         else if(strcmp(p->str,s)<0)
 33         {
 34             if(p->r)
 35             p=p->r;
 36             else
 37             {
 38                 q=new tr;
 39                 strcpy(q->str,s);
 40                 q->l=NULL;
 41                 q->r=NULL;
 42                 p->r=q;
 43                 return 1;
 44             }
 45         }
 46         else
 47         return 0;
 48     }
 49     return 0;
 50 }
 51 /*void pre(tr *qqq)
 52 {
 53     if(qqq)
 54     {
 55         cout<<qqq->str<<endl;
 56         pre(qqq->l);
 57         pre(qqq->r);
 58     }
 59 }*/
 60 int main()
 61 {
 62     int t,i,j,len,cou,sum;
 63     char s[100],s1[100];
 64     cin>>t;
 65     while(t--)
 66     {
 67         cin>>s;
 68         strcpy(head.str,s);
 69         head.l=NULL; head.r=NULL;
 70         sum=1;
 71         len=strlen(s);
 72         for(i=1; i<len; i++)
 73         {
 74             cou=0;
 75             for(j=0; j<i; j++)
 76             s1[cou++]=s[j];
 77             for(j=len-1; j>=i; j--)
 78             s1[cou++]=s[j];
 79             s1[cou]='';
 80             if(check(s1))
 81             sum++;
 82 
 83             cou=0;
 84             for(j=len-1; j>=i; j--)
 85             s1[cou++]=s[j];
 86             for(j=0; j<i; j++)
 87             s1[cou++]=s[j];
 88             s1[cou]='';
 89             if(check(s))
 90             sum++;
 91 
 92             cou=0;
 93             for(j=i-1; j>=0; j--)
 94             s1[cou++]=s[j];
 95             for(j=len-1; j>=i; j--)
 96             s1[cou++]=s[j];
 97             s1[cou]='';
 98             if(check(s1))
 99             sum++;
100 
101             cou=0;
102             for(j=len-1; j>=i; j--)
103             s1[cou++]=s[j];
104             for(j=i-1; j>=0; j--)
105             s1[cou++]=s[j];
106             s1[cou]='';
107             if(check(s1))
108             sum++;
109 
110             cou=0;
111             for(j=0; j<i; j++)
112             s1[cou++]=s[j];
113             for(j=i; j<=len-1; j++)
114             s1[cou++]=s[j];
115             s1[cou]='';
116             if(check(s1))
117             sum++;
118 
119             cou=0;
120             for(j=i; j<=len-1; j++)
121             s1[cou++]=s[j];
122             for(j=0; j<i; j++)
123             s1[cou++]=s[j];
124             s1[cou]='';
125             if(check(s1))
126             sum++;
127 
128             cou=0;
129             for(j=i-1; j>=0; j--)
130             s1[cou++]=s[j];
131             for(j=i; j<=len-1; j++)
132             s1[cou++]=s[j];
133             s1[cou]='';
134             if(check(s1))
135             sum++;
136 
137             cou=0;
138             for(j=i; j<=len-1; j++)
139             s1[cou++]=s[j];
140             for(j=i-1; j>=0; j--)
141             s1[cou++]=s[j];
142             s1[cou]='';
143             if(check(s1))
144             sum++;
145 
146             cou=0;
147             for(j=len-1; j>=i; j--)
148             s1[cou++]=s[j];
149             for(j=0; j<=i-1; j++)
150             s1[cou++]=s[j];
151             s1[cou]='';
152             if(check(s1))
153             sum++;
154         }
155         cout<<sum<<endl;
156         //tr *qqq;
157         //qqq=&head;
158         //pre(qqq);
159     }
160     return 0;
161 }

再贴一下map超时的。。

  1 #include <iostream>
  2 #include <cstring>
  3 #include <map>
  4 #include <algorithm>
  5 using namespace std;
  6 
  7 int main()
  8 {
  9     int t,i,j,len,cou,sum;
 10     char s[100],s1[100];
 11     int f;
 12     cin>>t;
 13     while(t--)
 14     {
 15         map<string,int>mp;
 16         map<string,int>::iterator iter;
 17         cin>>s;
 18         sum=0;
 19         len=strlen(s);
 20         for(i=1; i<len; i++)
 21         {
 22             cou=0;
 23             for(j=0; j<i; j++)
 24             s1[cou++]=s[j];
 25             for(j=len-1; j>=i; j--)
 26             s1[cou++]=s[j];
 27             s1[cou]='';
 28             f=0;
 29             iter=mp.begin();
 30             while(iter!=mp.end())
 31             {
 32                 if(iter->first==s1)
 33                 {
 34                     f=1;
 35                     break;
 36                 }
 37                 iter++;
 38             }
 39             if(f==0)
 40             {
 41                 sum++;
 42                 mp[s1]=1;
 43             }
 44             cou=0;
 45             for(j=len-1; j>=i; j--)
 46             s1[cou++]=s[j];
 47             for(j=0; j<i; j++)
 48             s1[cou++]=s[j];
 49             s1[cou]='';
 50              f=0;
 51             iter=mp.begin();
 52             while(iter!=mp.end())
 53             {
 54                 if(iter->first==s1)
 55                 {
 56                     f=1;
 57                     break;
 58                 }
 59                 iter++;
 60             }
 61             if(f==0)
 62             {
 63                 sum++;
 64                 mp[s1]=1;
 65             }
 66 
 67             cou=0;
 68             for(j=i-1; j>=0; j--)
 69             s1[cou++]=s[j];
 70             for(j=len-1; j>=i; j--)
 71             s1[cou++]=s[j];
 72             s1[cou]='';
 73             f=0;
 74             iter=mp.begin();
 75             while(iter!=mp.end())
 76             {
 77                 if(iter->first==s1)
 78                 {
 79                     f=1;
 80                     break;
 81                 }
 82                 iter++;
 83             }
 84             if(f==0)
 85             {
 86                 sum++;
 87                 mp[s1]=1;
 88             }
 89 
 90             cou=0;
 91             for(j=len-1; j>=i; j--)
 92             s1[cou++]=s[j];
 93             for(j=i-1; j>=0; j--)
 94             s1[cou++]=s[j];
 95             s1[cou]='';
 96             f=0;
 97             iter=mp.begin();
 98             while(iter!=mp.end())
 99             {
100                 if(iter->first==s1)
101                 {
102                     f=1;
103                     break;
104                 }
105                 iter++;
106             }
107             if(f==0)
108             {
109                 sum++;
110                 mp[s1]=1;
111             }
112 
113             cou=0;
114             for(j=0; j<i; j++)
115             s1[cou++]=s[j];
116             for(j=i; j<=len-1; j++)
117             s1[cou++]=s[j];
118             s1[cou]='';
119              f=0;
120             iter=mp.begin();
121             while(iter!=mp.end())
122             {
123                 if(iter->first==s1)
124                 {
125                     f=1;
126                     break;
127                 }
128                 iter++;
129             }
130             if(f==0)
131             {
132                 sum++;
133                 mp[s1]=1;
134             }
135 
136             cou=0;
137             for(j=i; j<=len-1; j++)
138             s1[cou++]=s[j];
139             for(j=0; j<i; j++)
140             s1[cou++]=s[j];
141             s1[cou]='';
142             f=0;
143             iter=mp.begin();
144             while(iter!=mp.end())
145             {
146                 if(iter->first==s1)
147                 {
148                     f=1;
149                     break;
150                 }
151                 iter++;
152             }
153             if(f==0)
154             {
155                 sum++;
156                 mp[s1]=1;
157             }
158             cou=0;
159             for(j=i-1; j>=0; j--)
160             s1[cou++]=s[j];
161             for(j=i; j<=len-1; j++)
162             s1[cou++]=s[j];
163             s1[cou]='';
164              f=0;
165             iter=mp.begin();
166             while(iter!=mp.end())
167             {
168                 if(iter->first==s1)
169                 {
170                     f=1;
171                     break;
172                 }
173                 iter++;
174             }
175             if(f==0)
176             {
177                 sum++;
178                 mp[s1]=1;
179             }
180 
181             cou=0;
182             for(j=i; j<=len-1; j++)
183             s1[cou++]=s[j];
184             for(j=i-1; j>=0; j--)
185             s1[cou++]=s[j];
186             s1[cou]='';
187              f=0;
188             iter=mp.begin();
189             while(iter!=mp.end())
190             {
191                 if(iter->first==s1)
192                 {
193                     f=1;
194                     break;
195                 }
196                 iter++;
197             }
198             if(f==0)
199             {
200                 sum++;
201                 mp[s1]=1;
202             }
203         }
204         cout<<sum<<endl;
205     }
206     return 0;
207 }
原文地址:https://www.cnblogs.com/bfshm/p/3482054.html