• "科林明伦杯"哈尔滨理工大学第八届程序设计竞赛——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,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;
        }
    }
    
  • 相关阅读:
    洛谷P4315 月下“毛景树”(边权维护)
    Water Tree CodeForces
    P3384 【模板】树链剖分
    Codeforces 161D Distance in Tree(树的点分治)
    git命令及使用方法
    vue下拉刷新,下拉加载更多
    Vue中 v-for 生成样式并默认选中第一个样式
    js面向对象实现分页版轮播图
    js面向对象实现购物车
    js面向对象实现放大镜
  • 原文地址:https://www.cnblogs.com/kuronekonano/p/11135816.html
Copyright © 2020-2023  润新知