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最后一位的首次匹配位置. 若为 ...
随机推荐
- maven用框架编写网页运行出现HTTP Status 500 - Unable to compile class for JSP
利用maven整合框架的时候,通过浏览器访问时,如果出现 HTTP 500-Unable to compile class for JSP 的错误,应该怎么解决呢? 之前在网上看了好多人的解决方案. ...
- macbookpro 以及 surface 的技术规格
macbookpro 13.3 英寸 (对角线) LED 背光显示屏 (采用 IPS 技术):初始分辨率 x ( ppi),支持数百万色彩 15.4 英寸 (对角线) LED 背光显示屏 (采用 IP ...
- JUnit测试提示Java.lang.Exception: No runnable methods
网上一大堆都说,没写@Test,或者是,导包错误,= =然而我并没有发现我有这个毛病 = =最后终于找到罪魁祸首 Junit版本太低!!! Junit版本太低!!! Junit版本太低!!! = =因 ...
- Socket和ObjectOutputStream问题
用到Socket序列化对象网络传输时ObjectOutputStream一直刷新连接 用户代码 package com.jachs.ladflower.ladflower; import java.n ...
- Could not render e, see the console.
错误截图: 解决: 在application.properties中开启swagger swagger2.enable=true
- Golang的select多路复用以及channel使用实践
看到有个例子实现了一个类似于核弹发射装置,在发射之前还是需要随时能输入终止发射. 这里就可以用到cahnnel 配合select 实现多路复用. select的写法用法有点像switch.但是和swi ...
- Java并发编程之ThreadGroup
ThreadGroup是Java提供的一种对线程进行分组管理的手段,可以对所有线程以组为单位进行操作,如设置优先级.守护线程等. 线程组也有父子的概念,如下图: 线程组的创建 public class ...
- flask 保存文件到 七牛云
上篇文章队长讲述了如何把前端上传的文件保存到本地项目目录 本篇 讲述一下把前端上传的文件保存到 第三方存储(七牛云) 七牛云相关步骤思路: 首先 进去七牛云官网,注册并实名认证来获取一个七牛云账号和存 ...
- 【python练习题】程序17
#题目:输入一行字符,分别统计出其中英文字母.空格.数字和其它字符的个数. s = input('请输入字符串:') alf = 0 space = 0 digi = 0 other = 0 for ...
- vpx
VPX 编辑 本词条缺少名片图,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧! VPX总线是VITA(VME International Trade Association, VME国际贸易协 ...