您的位置:首页 > 大数据 > 人工智能

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

2016-07-28 22:58 375 查看
这题涉及面有点广啊,做之前建议先了解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();
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  STL codeforces