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最后一位的首次匹配位置. 若为 ...
随机推荐
- vue的三种传参方式
<template> <div> <router-link :to="{'name':'x',params:{'type':'users'}}"> ...
- artTemplate之初印象
介绍 art-template 是JavaScript模板引擎,是一个简约.超快的模板引擎. 它采用作用域预声明的技术来优化模板渲染速度,从而获得接近 JavaScript 极限的运行性能,并且同时支 ...
- [转帖]Office全版本零售版转换VOL
Office全版本零售版转换VOL https://blog.51cto.com/10981246/2062137 转成bat 执行 改天试试 @ECHO OFF&PUSHD %~DP0 ...
- HDU 2459 Maximum repetition substring
题目:Maximum repetition substring 链接:http://acm.hdu.edu.cn/showproblem.php?pid=2459 题意:给你一个字符串,求连续重复出现 ...
- C# Note5:使用相对路径读取文件
一.C#中使用相对路径读取配置文件 一般Solution的目录结构如下图所示: (如过看不到某些文件,可以点击 “显示所有文件” 图标) 方法一:由于生成的exe文件在bin\debug目录下,可以使 ...
- vue+webpack项目打包后背景图片加载不出来问题解决
在做VUE +的WebPack脚手架项目打包完成后,在IIS服务器上运行发现项目中的背景图片加载不出来检查项目代码发现是因为CSS文件中,背景图片引用的路径问题;后来通过修改配置文件,问题终于解决了, ...
- java日志框架之logback(一)——logback工程简介
Logback工程 致力于成为log4j工程的继承者 Logback的架构足够泛型化,故能够应用于许多不同的环境.当前,logback划分为三个组件: logback-core logback-cla ...
- QTP 自动化测试--定义变量
1 Dim suffixsuffix=get_currentdatetxt("001")
- 二、.Net 连接mycat
一.mycat 单体的mysql已经过去 二.引用Mycat包 三.代码 using Pomelo.Data.MyCat; using System; using System.Collections ...
- ES 6 系列 - 变量声明
let 和 const let 声明 (一)基本用法 let 声明的变量只在块级作用域内有效,出了该块则报错,最常见且适合的地方在 for 循环中: var a = []; for (var i = ...