Description
小H是一个可爱的女孩,她特别喜欢看推特(tweeter)。有一天她得到了某位用户的一些推特消息,想从中提取出这个用户在这些消息中@了哪些人。但是这些消息太长了,她想请你来帮她完成这个任务。
每条消息中只会包含ASCII编码中的可见字符与空格。
推特中用户名的定义为一个长度大于0的字符串,且字符串中只包括数字0-9,英文字符a-z与A-Z,’-’与’_’。用户名区分大小写。
对@一个人的判定方式为:在消息中出现了”@username”,其中username为一个用户名,且为’@’后面所能匹配到最长的用户名。如”@TOM”,只能得到用户名TOM而不能得到用户名TO。同时’@’前面不能是一个合法的用户名字符,我们以此排除所有的邮箱信息。如”x@qq.com”我们不会提取出用户名,但”.@qq.com”我们要从中提取出”qq”。
Input
输入数据第一行为T,代表数据组数。(T<=5)
对于每组数据,第一行为n,代表推特消息数。接下来的n行中,每一行有一条长度小于140的推特消息。(n<=5)
Output
对于每组数据,第一行为k,代表n条消息中共@了多少个人(若同一个人被@了不止一次,则我们只记录一次)。接下来的k行中,每一行输出一个被@的用户名,k个用户名按照字典序排序。
Sample Input
2
5
@all, wish you have a nice contest~~~
Good Luck with you, @Contestant, @HUST!
Have Fun! :-) @All
Competition Topics By @HIT-CCPC
All Copyright Reserved @CCPC2018, @HIT-CCPC
4
HIT@CCPC
@HUST
@HIT-CCPC
@CCPC2018
Sample Output
6
All
CCPC2018
Contestant
HIT-CCPC
HUST
all
3
CCPC2018
HIT-CCPC
HUST
一个简单的模拟题,如果运气不好代码哪里没注意或者少考虑了情况修bug就会修死人的。。。运气还行当时一发就过了。主要就是查找字符串中的@,然后对@前后的情况进行一个判断,因为题目中说明了@前必须不能是合法字符,此处判断一下,特判一下@在字符串首位的时候,还有就是@后一位的位置要判断,是否合法,才能判断此处是不是一个应该录入的名字。
然后一些特殊情况,连续 的几个@@@@@以及@前后都是空格,当然这一并考虑到@左右是否是合法字符里的情况了。基本上就是这样,听说很多大佬被卡了很久。。。。
此处去重用的map标记,记录字符串用的vector存储。
#include<stdio.h>
#include<string.h>
#include<vector>
#include<map>
#include<algorithm>
#include<iostream>
#include<string>
#define LL long long
using namespace std;
const LL MOD=1000000007;
char a[150];
bool judge(int pos)
{
if((a[pos]>='0'&&a[pos]<='9')||
(a[pos]>='A'&&a[pos]<='Z')||
(a[pos]>='a'&&a[pos]<='z')||
a[pos]=='-'||a[pos]=='_')
return true;
return false;
}
int main()
{
int t,n;
vector<string>ans;
map<string,bool>vis;
scanf("%d",&t);
while(t--)
{
ans.clear();
vis.clear();
scanf("%d",&n);
getchar();
while(n--)
{
gets(a);
// printf("%d......%s
",n,a);
int len=strlen(a);
for(int i=0; i<len; i++)
{
if(a[i]=='@'&&judge(i+1))
{
if(i==0)
{
i++;
string tmp;
tmp.clear();
while(judge(i)) tmp+=a[i++];
// cout<<tmp<<endl;
if(!vis[tmp])
{
vis[tmp]=true;
ans.push_back(tmp);
}
}
else if(!judge(i-1))
{
i++;
string tmp;
tmp.clear();
while(judge(i)) tmp+=a[i++];
if(!vis[tmp])
{
vis[tmp]=true;
ans.push_back(tmp);
}
}
}
}
}
sort(ans.begin(),ans.end());
printf("%d
",ans.size());
for(int i=0; i<ans.size(); i++) cout<<ans[i]<<endl;
}
}