HRBUST - 2378
小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
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;
int main() {
#ifdef LOCAL
freopen("Text.txt", "r", stdin);
#endif
int loop;
cin >> loop;
while (loop--) {
int n;
vector<string>v;
cin >> n;
getchar();
while (n--) {
string s;
getline(cin, s);
for (int i = 0; s[i]; i++) {
if (s[i] == '@') {
string p;
if (i != 0 && ((s[i - 1] >= 'A'&&s[i - 1] <= 'Z') || (s[i - 1] >= 'a'&&s[i - 1] <= 'z') || (s[i - 1] >= '0'&&s[i - 1] <= '9') || s[i - 1] == '-' || s[i - 1] == '_'))
continue;
int j = i + 1;
for (; s[j]; j++) {
if ((s[j] >= 'A'&&s[j] <= 'Z') || (s[j] >= 'a'&&s[j] <= 'z') || (s[j] >= '0'&&s[j] <= '9') || s[j] == '-' || s[j] == '_') {
p += s[j];
}
else break;
}
if (p != ""&&find(v.begin(), v.end(), p) == v.end()) {
v.push_back(p);
}
}
}
}
cout << v.size() << endl;
sort(v.begin(), v.end());
for (int i = 0; i < v.size(); i++)
cout << v[i] << endl;
}
return 0;
}