CodeForces

题目连接:http://codeforces.com/problemset/problem/589/A

题目大意:给你n个字符串,请你将它分类并输出。其中不分字母大小写(即‘A’='a'),当字符串尾缀为@bmail.com时,则@符号前面的字符串如果有‘.’则消掉,如果有'+',则‘+’字符及之后到@之前的字符无效。看样例就明白了。

map知识点:map里面存的就是pair类型,其定义方式为map<第一个数据类型,第二个数据类型> name,第一个数据类型为map的数据,第二个数据类型为map数据的值,故压入map的一个简单方式可以这样:map[第一个数据类型数据]=第二个数据类型数据。map存储数据是有序的,故能快速找到map里面有没有存第一个数据,其寻找方式为name.find(第一个数据)==name.end();这个意思是如果没找到,find()便找到map的最后,表达式真值为1,表示未找到第一个数据。

这题的ac代码:

 1 #include<iostream>
 2 #include<cstring>
 3 #include<vector>
 4 #include<cstdio>
 5 #include<map>
 6 using namespace std;
 7 char str[20005][105],str1[20005][105],per[]="@bmail.com",check[15];
 8 int main()
 9 {
10     int n;
11     while(cin>>n)
12     {
13         int count=0;
14         getchar();
15         vector<int> vec[20005];
16         map<string,int> amap;
17         for(int i=0;i<n;i++)
18         {
19             scanf("%s",str[i]);
20             int len=strlen(str[i]);
21             for(int j=0;j<len;j++)
22             {
23                 str1[i][j]=str[i][j];
24                 if(str[i][j]<='Z'&&str[i][j]>='A')
25                 str1[i][j]-=('A'-'a');
26             }
27             if(len<10)
28             check[0]='';
29             else
30             for(int j=0;j<10;j++)
31             check[j]=str1[i][len-(10-j)];
32         //    cout<<"#   "<<check<<endl;
33             if(strcmp(check,per)==0)
34             {
35                 for(int j=0;j<len-10;j++)
36                 {
37                     if(str1[i][j]=='.')
38                     {
39                         for(int l=j;l<len;l++)
40                         str1[i][l]=str1[i][l+1];
41                         j--;
42                     }
43                     else if(str1[i][j]=='+')
44                     {
45                         for(int l=j;l<=j+10;l++)
46                         str1[i][l]=check[l-j];
47                         str1[i][j+11]='';
48                         break;
49                     }
50                 }
51             }
52             if(amap.find(str1[i])==amap.end())
53             {
54                 count++;
55                 amap[str1[i]]=count;
56                 vec[count].push_back(i);
57             }
58             else
59             vec[amap[str1[i]]].push_back(i);
60         //    cout<<"****"<<str1[i]<<endl;
61         //    cout<<t<<endl;
62         }
63         printf("%d
",count);
64         for(int j=1;j<=count;j++)
65         {
66             printf("%d",vec[j].size());
67             for(int l=0;l<vec[j].size();l++)
68             printf(" %s",str[vec[j][l]]);
69             printf("
");
70         }
71     }
72     return 0;
73 }
原文地址:https://www.cnblogs.com/wwq-19990526/p/9408158.html