"科林明伦杯"哈尔滨理工大学第八届程序设计竞赛——Hrbust-2378 小H的问题(模拟)

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",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\n",ans.size());
        for(int i=0; i<ans.size(); i++) cout<<ans[i]<<endl;
    }
}
posted @ 2018-03-26 01:12  KuroNekonano  阅读(160)  评论(0编辑  收藏  举报