【HDU 3242 List Operations】 字符串处理

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3242

 

题目大意:给你两个集合,A,B,让你实现操作A+B,A-B(集合内能存相同的)。

 

解题思路:

开始脑抽了,我居然用遍历进行判断一个一个去标记去判断,完全的胡搞,各种测试各种对,wrong answer到死,下次再来检查。

过不了,果断换一种写法。用vector去存储相加删除,代码简洁清晰,汗颜,开始怎么没想到呢。

 

AC代码:

 1 #include <iostream>

 2 #include <cstdio>

 3 #include <vector>

 4 #include <algorithm>

 5 #include <cstring>

 6 #include <string>

 7 using namespace std;

 8 

 9 vector<string>vt;

10 vector<string>::iterator it;

11 string str1, str2, op;

12 

13 void Push(string str)

14 {

15     vt.clear();

16     int len=str.size();

17     string s="";

18     for(int i=1; i<len; i++)

19     {

20         if(str[i]==','|| str[i]==']')

21         {

22             if(s!="") vt.push_back(s);

23             s="";

24         }

25         else s+=str[i];

26     }

27 }

28 

29 void Add(string str)

30 {

31     int len=str.size();

32     string s="";

33     for(int i=1; i<len; i++)

34     {

35         if(str[i]==','||str[i]==']')

36         {

37             if(s!="") vt.push_back(s);

38             s="";

39         }

40         else s+=str[i];

41     }

42 }

43 

44 void Sub(string str)

45 {

46     int len=str.size();

47     string s="";

48     for(int i=1; i<len; i++)

49     {

50         if(str[i]==','||str[i]==']')

51         {

52             for(it=vt.begin(); it!=vt.end(); it++)

53             {

54                 if(*it==s)

55                 {

56                     vt.erase(it); break;

57                 }

58             }

59             s="";

60         }

61         else s+=str[i];

62     }

63 }

64 

65 int main()

66 {

67     while(cin >> str1)

68     {

69         if(str1==".") break;

70         vt.clear();

71         cin >> op >> str2;

72         Push(str1);

73         if(op=="++") Add(str2);

74         else  Sub(str2);

75         if(vt.begin()==vt.end()){cout << "[]" <<endl; continue;} //特别注意空集合的判断

76         cout << "[";

77         for(it=vt.begin(); it!=vt.end(); it++)

78         {

79             if((it+1)!=vt.end()) cout << *it << "," ;

80             else cout << *it << "]" <<endl;

81         }

82     }

83     return 0;

84 }

 

还没过的代码,下次再来调试。

View Code
 1 #include <iostream>

 2 #include <cstdio>

 3 #include <algorithm>

 4 #include <cstring>

 5 using namespace std;

 6 

 7 int main()

 8 {

 9     char s1[80], ch[5], s2[80];

10     int  color[80];

11     while(~scanf("%s",s1))

12     {

13         if(s1[0]=='.')  break;

14         scanf("%s%s",ch,s2);

15         memset(color,0,sizeof(color));

16         int lenb=strlen(s2);

17         int lena=strlen(s1);

18         if(ch[0]=='-')

19         {

20             if(lena==2)

21             {

22                 cout << "[]" <<endl;

23                 continue;

24             }

25             int i=1;

26             while(i<lenb)

27             {

28                 if(s2[i]==','||s2[i]==']') { i++; continue; }

29                 else if('0'<=s2[i]&&s2[i]<='9')

30                 {

31                     int tmp=s2[i]-'0';

32                     i++;

33                     while('0'<=s2[i]&&s2[i]<='9')

34                     {

35                         tmp=tmp*10+s2[i]-'0';

36                         i++;

37                     }

38                     int j=1;

39                     while(j<lena)

40                     {

41                         if(color[j]||s1[j]==','||s1[j]==']'||('a'<=s1[j]&&s1[j]<='z')){j++; continue;}

42                         int st=j;

43                         int sum=s1[j]-'0';

44                         j++;

45                         while('0'<=s1[j]&&s1[j]<='9')

46                         {

47                             sum=sum*10+s1[j]-'0';

48                             j++;

49                         }

50                         if(tmp==sum)

51                         {

52                             if(s1[st-1]==',') color[st-1]=1;

53                             for(int k=st; k<j; k++)

54                                 color[k]=1;

55                             break;

56                         }

57                     }

58                 }

59                 else if('a'<=s2[i]&&s2[i]<='z')

60                 {

61                     for(int j=1; j<lena; j++)

62                     {

63                         if(!color[j]&&s2[i]==s1[j])

64                         {

65                             if(s1[j-1]==',') color[j-1]=1;

66                             color[j]=1;

67                             break;

68                         }

69                     }

70                     i++;

71                 }

72             }

73             char pre='#';

74             int ans=0;

75             for(int i=0; i<lena; i++)

76             {

77                 if(color[i]) continue;

78                 if(s1[i]==','&&pre==',') continue;

79                 if(('a'<=s1[i]&&s1[i]<='z')||('0'<=s1[i]&&s1[i]<='9')) ans++;

80                 pre=s1[i];

81                 if(s1[i]==','&&ans==0) continue;

82                 if(!color[i]) printf("%c",s1[i]);

83             }

84             puts("");

85         }

86         else

87         {

88             s1[lena-1]='\0';

89             printf("%s",s1);

90             if(lenb!=2&&lena!=2)

91                 printf(",");

92             for(int i=1; i<lenb; i++)

93                 printf("%c",s2[i]);

94             puts("");

95         }

96     }

97     return 0;

98 }

 

 

 

你可能感兴趣的:(Opera)