2016 Personal Training #7 Div.2 CodeForces 589A Email Aliases

来源:互联网 发布:mongodb 数据库设计 编辑:程序博客网 时间:2024/05/31 06:23

这题涉及面有点广啊,做之前建议先了解map和vector这些STL知识,字符串了解下strcpy和strcmp函数知识,c++中string输出记得用c++ cout输出。

题意:输入个数n然后输入n行字符串,所有这些字符串大小写不区分,这些字符串类似于平时用的邮箱地址格式login@domain 有个特殊的格式@bmail.com 这个字符@前的'.'字符相当于没有,@前的'+'字符后面的所有字符都相当于没有,找出这n个字符串中有多少种不同的字符串分别输出每一种有多少个,后面接着输出这种字符串所有的字符串。

思路:我们可以强制将所有大写转换为小写,然后根据条件处理'.'和'+',最后map映射字符串找出总共多少种,vector存入每种后面的所有字符串。

代码如下:

#include<bits/stdc++.h>using namespace std;typedef long long LL;#define INF 0x3f3f3f3fchar str[105];char S[]={"bmail.com"};int num[105];int main(){  int n;  while(~scanf("%d",&n)){      map<string,int>p;map<string,int>::iterator it;vector<string>d[20005];  int sum=0;  p.clear();  while(n--)  {    char str1[105],s[105];    scanf("%s",str);    int len=strlen(str),pos;    strcpy(str1,str);    //printf("      %s\n",str1);    for(int i=0;i<len;i++)    {      if(str1[i]>='A'&&str1[i]<='Z')      {        str1[i]+=32;      }      if(str1[i]=='@')      {        pos=i;      }    }    int len1=0;    //printf("------%s\n",str1+pos+1);    if(strcmp(str1+pos+1,S)==0)    {    for(int i=0;i<pos;i++)    {      if(str1[i]=='.') continue;      if(str1[i]=='+') break;      s[len1++]=str1[i];    }    //printf("*****%s\n",str1);    for(int i=pos;i<len;i++)    {      s[len1++]=str1[i];    }    s[len1]=0;    //printf("#####%s\n",str1);    if(p.find(s)==p.end()) p[s]=sum++;    int cnt=p[s];d[cnt].push_back(str);    continue;    }    //printf("-------%d  %s\n",pos,str1);    if(p.find(str1)==p.end())       p[str1]=sum++;    int cnt=p[str1];    d[cnt].push_back(str);  }  printf("%d\n",sum);  for(int i=0;i<sum;i++)  {    printf("%d",d[i].size());    for(int j=0;j<d[i].size();j++)    {      cout<<" "<<d[i][j];    }    printf("\n");    d[i].clear();  }  }}


0 0
原创粉丝点击