开始用vector模拟,用一个迭代器its来保存当前光标位置,写完发现insert可能复杂度有点高还是什么的,tle了。。。

后来用另一个方法,从后往前遍历,用一个数r 来表示每次光标移到前面后再次移动的位置(可能说的不是很清楚,具体看代码吧。。。囧rz)每次碰到'['则输出从'['到r 的字符并标记已经输出过,最后从前往后遍历,顺序输出还未输出过的字符。

 

 

 1 #include <iostream>
 2 #include <cstring>
 3 #include <cstdio>
 4 #include <algorithm>
 5 using namespace std;
 6 
 7 const int maxn = 100005;
 8 
 9 int main (){
10     int visit[maxn];
11     char str[maxn];
12     while (gets(str)!=NULL){
13         int len=strlen(str);
14         memset (visit,0,sizeof visit);
15         int r;
16         r=len;
17         for (int i=len-1;i>=0;i--){
18             if (str[i]==']')
19                 r=i;
20             if (str[i]=='['){
21                 for (int j=i+1;j<r;j++)
22                     if (str[j]!='['&&str[j]!=']')
23                         printf ("%c",str[j]),visit[j]=1;
24                 r=i;
25             }
26         }
27         for (int i=0;i<len;i++)
28             if (!visit[i]&&str[i]!='['&&str[i]!=']')
29                 printf ("%c",str[i]);
30         printf ("\n");
31                 
32     }
33     return 0;
34 }

 

 

 

 

vector的写法也贴一下,虽然TLE 了 囧

 1 #include <iostream>
 2 #include <cstring>
 3 #include <cstdio>
 4 #include <vector>
 5 using namespace std;
 6 
 7 int main (){
 8     vector <char> s(100005);
 9     char str[100005];
10     while (scanf ("%s",str)!=EOF){
11         s.clear ();
12         vector<char>::iterator its=s.begin() ;
13         int len=strlen(str);
14         for (int i=0;i<len;i++){
15             if (str[i]=='['){
16                 its=s.begin() ;
17                 continue ;
18             }
19             if (str[i]==']'){
20                 its=s.end() ;
21                 continue ;
22             }
23             its=s.insert(its,str[i])+1; 
24         }
25         for (its=s.begin() ;its!=s.end() ;its++)
26             printf ("%c",*its);
27         printf ("\n");
28     }
29     return 0;
30 }
View Code

 

posted on 2014-08-04 14:51  gfc  阅读(173)  评论(0编辑  收藏  举报