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

题目大意:给定n个邮件地址,任何电子邮件地址都将显示为“login @ domain”,其中:

1.a“login”是一个由非空的小写和大写字母序列以及点('.')和加号('+')组成的序列,从字母开始;
2.a“domain”是一个由非空的小写和大写字母和点组成的序列,因为点将序列分成非空单词,仅由字母组成(即“domain”从字母开始,以字母结尾,不包含两个或多个连续点)。

比较邮件地址时,不考虑字符的大小写。此外,在比较bmail.com地址时,服务器会忽略登录中的点以及电子邮件地址登录部分中第一个字符“加”(“+”)到字符“at”(“@”)的所有字符。

在给定n个邮件地址后,让你输出每个邮件地址出现的次数与所有这个邮箱的原始串。

例:

输入:

6
ICPC.@bmail.com
p+con+test@BMAIL.COM
P@bmail.com
a@bmail.com.ru
I.cpc@Bmail.Com
a+b@bmail.com.ru

输出:

4
2 ICPC.@bmail.com I.cpc@Bmail.Com
2 p+con+test@BMAIL.COM P@bmail.com
1 a@bmail.com.ru
1 a+b@bmail.com.ru

解题思路:题目有点长,理解题目理解了老半天。题目好像没有涉及什么算法,不过对代码能力好像要求还是有点的,看了别人的代码才好不容易码出来了。。。做法大概就是直接定义一个结构体数组,用来存储每个字符串的原字符串和忽略那些不必要的变形之后的字符串,以及存储他们所在的位置下标。先排序将变形后相同的字符串排在相邻的位置,然后将变形后相同的字符串的下标存到一个ans向量组里,向量的大小即为该字符串相同的数量。输出时再将结构体数组排成初始顺序即可。

附上代码:

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
struct node{
string s; //存储原字符串
string change; //存储改变之后的字符串
int id; //存储位置下标
}st[];
vector<int> ans[]; //相同字符串的下标存在同一个向量里面
int n; bool comp(const node &a,const node &b)
{ //相同的字符串排在一起
if(a.change==b.change)
return a.id<b.id;
return a.change<b.change;
} bool comp1(const node &a,const node &b)
{ //恢复成它们的初始位置
return a.id<b.id;
}
int main()
{
while(cin>>n)
{
for(int i=;i<n;i++)
{
cin>>st[i].s;
st[i].id=i;
ans[i].clear();
}
for(int i=;i<n;i++)
{
string temp;
if(st[i].s.size()>=)
{
temp=st[i].s.substr(st[i].s.size()-,); //如果字符串长度大于10则取出后10位字符,判断是否为"@bmail.com"
for(int j=;j<;j++)
temp[j]=towlower(temp[j]); //将temp转换成小写
//cout<<temp<<endl;
}
if(temp=="@bmail.com")//判断该字符串后10位是否为"@bmail.com"
{
bool ok=false,ok1=false;
for(int j=;j<st[i].s.size();j++)
{
if(st[i].s[j]=='@') ok=false,ok1=true;
if(st[i].s[j]=='+') ok=true;
if((st[i].s[j]=='.'&&!ok1)||ok) continue; //在第一个“+”至“@”内的不计
st[i].change.push_back(towlower(st[i].s[j])); //转换成小写
}
}
else //普通邮件地址,直接转换成小写
{
for(int j=;j<st[i].s.size();j++)
st[i].change.push_back(towlower(st[i].s[j]));
}
}
sort(st,st+n,comp);
int cnt=;
ans[].push_back(st[].id);
for(int i=;i<n;i++) //比较字符串是否相同,相同的下标放到同一个向量
{
if(st[i].change==st[i-].change) ans[cnt].push_back(st[i].id);
else ans[++cnt].push_back(st[i].id);
}
sort(st,st+n,comp1);
cout<<cnt+<<endl;
for(int i=;i<=cnt;i++)
{
cout<<ans[i].size(); //向量的大小即为该相同字符串的数量
for(int j=;j<ans[i].size();j++)
cout<<" "<<st[ans[i][j]].s;
cout<<endl;
}
}
return ;
}

CodeForces - 589A(字符串处理)的更多相关文章

  1. TTTTTTTTTTTTTTTTTT CodeForces 589A Email Aliases 字符串 map

    A - Email Aliases Time Limit:2000MS     Memory Limit:524288KB     64bit IO Format:%I64d & %I64u ...

  2. CodeForces - 589A

    题目链接:http://codeforces.com/problemset/problem/589/A Polycarp has quite recently learned about email ...

  3. CodeForces 625B 字符串模拟+思维

    题意 给出字符串a与b 可以将a中的单个字符改为# 问最少改多少次 a中就找不到b了 一开始想的是用strstr 因为如果找到 可以将strstr(a,b)-a+1改成# 即改首字母 用while循环 ...

  4. CodeForces - 1025C 字符串处理,画一个圆。。。

    题目链接: https://vjudge.net/problem/1810469/origin 题目大意: 给你一个字符串,中间切一刀,左右两边均反转,然后右边的串拼接到左边上. 思路: 比如  aa ...

  5. CodeForces - 589A(二分+贪心)

    题目链接:http://codeforces.com/problemset/problem/589/F 题目大意:一位美食家进入宴会厅,厨师为客人提供了n道菜.美食家知道时间表:每个菜肴都将供应. 对 ...

  6. Swapping Characters CodeForces - 903E (字符串模拟)

    大意: 给定k个字符串, 长度均为n, 求是否存在一个串S, 使得k个字符串都可以由S恰好交换两个字符得到. 暴力枚举交换的两个字符的位置, 计算出交换后与其他串不同字符的个数, 若为1或>2显 ...

  7. CodeForces - 589A (STL容器的使用)

    Polycarp has quite recently learned about email aliases. Of course, he used to suspect that the case ...

  8. Maximum Questions CodeForces - 900E (字符串,dp)

    大意:给定长$n$的字符串$s$, 只含'a','b','?', '?'可以替换为任意字符, 在给定长$t$的字符串, "ababab...", 求替换尽量少的'?', 使得$s$ ...

  9. Codeword CodeForces - 666C (字符串计数)

    链接 大意:求只含小写字母, 长度为n, 且可以与给定模板串匹配的字符串个数 (多组数据) 记模板串为P, 长为x, 总串为S. 设$f_i$为S为i时的匹配数, 考虑P最后一位的首次匹配位置. 若为 ...

随机推荐

  1. 【Python3练习题 012】 输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。

    ASCII 码表的对应值,知道 ord('a') 能将字符 'a' 转化为 ASCII 码表上对应的数值,就可以了.其中,数字 0-9 对应的码值为 48-57,大写字母 A-Z 对应 65-90,小 ...

  2. Mission Impossible 6

    题目:Mission Impossible 6 题目链接:http://hihocoder.com/problemset/problem/1228 题目大意: 大概就是让我们写一个代码模拟文本编辑器的 ...

  3. liunx 运维知识一部分

    一   克隆虚拟机 大家都需要做的克隆虚拟机,在克隆虚拟机之前,需要把网卡源的UUID和Mac地址全部删除掉.不然相同会冲突使用不了. 删除UUID跟Mac的操作步骤如下:  cd /etc/sysc ...

  4. mac 中登陆mysql忘记密码解决办法

    1.打开终端,输入命令:cd /usr/local/mysql/bin 2.mysql -uroot -p,用这条命令登陆时报错信息: 报错:Enter password: ERROR 1045 (2 ...

  5. Django--CRM--modelformset的用法

    一 . modelformset用法 其实和modelform方法差不多,只不过是显示的时候可以直接修改,显示的select的那种模式 from django.forms import modelfo ...

  6. jackson使用问题:mapper.readValue()将JSON字符串转反序列化为对象失败或异常

    问题根源:转化目标实体类的属性要与被转JSON字符串总的字段 一 一对应!字符串里可以少字段,但绝对不能多字段. 先附上我这段出现了问题的源码: // 1.接收并转化相应的参数.需要在pom.xml中 ...

  7. 在页面中有overflow-y:auto属性的div,当出现滚动条,点击返回顶部按钮,内容回这个div最顶部

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. linux 挂载windows下目录,其它linux机器nfs的目录,自己dd的文件

    如有转载,不胜荣幸.http://www.cnblogs.com/aaron-agu/ 挂载window下共享的目录 //192.168.0.11/share /mnt 挂载其它linux机器下目录 ...

  9. java基础1之基本数据类型

    java的数据类型 整数型(byte.short.int.long) 编程过程中,默认是int类型.long类型的字面值后面需要加上L或l PS:java底层,byte.short是按照32位计算的. ...

  10. linu系统文件授权命令