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

这题涉及面有点广啊,做之前建议先了解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 0x3f3f3f3f
char 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值