洛谷2264 情书

题解 算法-模拟 字符串 提高+/省选-
题目链接 编辑文章

题意

给出 $n(n\le 100)$ 个单词,求一段长度不超过 $1000$ 的情书中出现了多少次这些单词,一句话中只统计一次。

题解

小清新模拟题,用 map 标记给出的单词以及当前这句话里是否出现过。

#include<bits/stdc++.h>

using namespace std;

inline int read()
{
    char ch=getchar(); int f=1,x=0;
    while (ch<'0' || ch>'9') { if (ch=='-') f=-1; ch=getchar(); }
    while (ch>='0' && ch<='9') { x=x*10+ch-'0'; ch=getchar(); }
    return f*x;
}

int n,ans;
string s,x;
map <string,bool> mp,in;

inline void work(string x) //统计 x 答案
{
    if (!in[x]) return;
    if (!mp.count(x)) ans++;
    mp[x]=1;
}

signed main()
{
    n=read();
    for (int i=1;i<=n;i++)
    {
        cin>>s;
        int len=s.length();
        for (int i=0;i<len;i++) s[i]=tolower(s[i]);
        in[s]=1;
    }
    while (cin>>x)
    {
        int len=x.length();
        for (int i=0;i<len;i++) x[i]=tolower(x[i]);
        int st=0; //当前单词的起点
        for (int i=0;i<len;i++)
        {
            if (x[i]=='.' || x[i]==',')
            {
                string cur=x.substr(st,i-st);
                work(cur);
                if (x[i]=='.') mp.clear();
                st=-1;
            }
            else if (st==-1) st=i;
        }
        if (st!=-1) work(x.substr(st,len-st)); //还有剩余单词需要处理
    }
    return !printf("%d",ans);
}

新评论

称呼不能为空
邮箱格式不合法
网站格式不合法
内容不能为空