CodeForces - 589A 用map节省字符串比较的时间
题目连接: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]='\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]='\0'; 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\n",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("\n"); 70 } 71 } 72 return 0; 73 }