CodeForces - 589A(字符串处理)
题目链接: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(字符串处理)的更多相关文章
- TTTTTTTTTTTTTTTTTT CodeForces 589A Email Aliases 字符串 map
A - Email Aliases Time Limit:2000MS Memory Limit:524288KB 64bit IO Format:%I64d & %I64u ...
- CodeForces - 589A
题目链接:http://codeforces.com/problemset/problem/589/A Polycarp has quite recently learned about email ...
- CodeForces 625B 字符串模拟+思维
题意 给出字符串a与b 可以将a中的单个字符改为# 问最少改多少次 a中就找不到b了 一开始想的是用strstr 因为如果找到 可以将strstr(a,b)-a+1改成# 即改首字母 用while循环 ...
- CodeForces - 1025C 字符串处理,画一个圆。。。
题目链接: https://vjudge.net/problem/1810469/origin 题目大意: 给你一个字符串,中间切一刀,左右两边均反转,然后右边的串拼接到左边上. 思路: 比如 aa ...
- CodeForces - 589A(二分+贪心)
题目链接:http://codeforces.com/problemset/problem/589/F 题目大意:一位美食家进入宴会厅,厨师为客人提供了n道菜.美食家知道时间表:每个菜肴都将供应. 对 ...
- Swapping Characters CodeForces - 903E (字符串模拟)
大意: 给定k个字符串, 长度均为n, 求是否存在一个串S, 使得k个字符串都可以由S恰好交换两个字符得到. 暴力枚举交换的两个字符的位置, 计算出交换后与其他串不同字符的个数, 若为1或>2显 ...
- CodeForces - 589A (STL容器的使用)
Polycarp has quite recently learned about email aliases. Of course, he used to suspect that the case ...
- Maximum Questions CodeForces - 900E (字符串,dp)
大意:给定长$n$的字符串$s$, 只含'a','b','?', '?'可以替换为任意字符, 在给定长$t$的字符串, "ababab...", 求替换尽量少的'?', 使得$s$ ...
- Codeword CodeForces - 666C (字符串计数)
链接 大意:求只含小写字母, 长度为n, 且可以与给定模板串匹配的字符串个数 (多组数据) 记模板串为P, 长为x, 总串为S. 设$f_i$为S为i时的匹配数, 考虑P最后一位的首次匹配位置. 若为 ...
随机推荐
- Windows10 等 administrator 打开IE 或者edge的方法
gpedit.msc 组策略处理即可
- 902. Kth Smallest Element in a BST
Given a binary search tree, write a function kthSmallest to find the kth smallest element in it. You ...
- cordova微信支付回调App闪退
这是cordova版本太高,不兼容这个插件所导致的.解决方案是修改$your_project/plugins/cordova-plugin-wechat/scripts/android-install ...
- Linux基础学习笔记2-文件管理和重定向
本节内容 1)文件系统结构元素 2)创建和查看文件 3)复制.转移和删除文件 4)软和硬链接 5)三种I/O设备 6)把I/O重定向至文件 7)使用管道 文件系统和结构 文件系统 文件和目录被组织成一 ...
- 不停机修改线上 MySQL 主键字段 以及其带来的问题和总结思考
起因: 线上 user 数据库没有自增字段,数据量已经达到百万级.无论是给离线仓库还是数据分析同步数据,没有主键自增 id 都是杀手级的困难.所以在使用 create_time 痛苦了几次之后准备彻底 ...
- Java开发之@PostConstruct执行顺序
构造函数==>postConstruct==>init==destory==>predestory==卸载servlet;; 从Java EE5规范开始,Servlet增加了两个影响 ...
- Python自动化测试之selenium从入门到精通
1. 安装selenium 首先确保python安装成功,输入python -V 在windows下使用pip安装selenium,详情如图所示: 在ubuntu下使用pip install sele ...
- 阿里云ECS服务器,CentOS 7.4配置jdk+tomcat+mysql
参考博客: https://mp.weixin.qq.com/s?__biz=MzIxMzk3Mjg5MQ==&mid=2247484020&idx=1&sn=6e0aa07f ...
- SpringJdbc框架
import javax.sql.DataSource; import org.springframework.jdbc.core.JdbcTemplate; import JdbcUtils.Jdb ...
- 10.Service资源发现
Kubernetes Pods是不可控的.每当一个pod停止后,他不是重启,而是重建.ReplicaSets特别是Pods动态地创建和销毁(例如,当向外扩展或向内扩展时).虽然每个PodIP地址都有自 ...