P2264 情书

传送门

正常会想到字典树

然鹅数据怎么小直接map也能过

然后就写map暴力匹配了

毫无思维难度,毫无代码难度

注意逗号算单词分隔符,如果有句号就算另一句

同一句的单词重复出现只计算一次贡献

再开个map来判重就好了

注意不区分大小写

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<map>
using namespace std;
inline int read()
{
    int x=0,f=1; char ch=getchar();
    while(ch<'0'||ch>'9') { if(ch=='-') f=-1; ch=getchar(); }
    while(ch>='0'&&ch<='9') { x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }
    return x*f;
}
int n,ans,len;
map <string,bool> mp,vis;
string s,t;
int main()
{
    n=read();
    for(int i=1;i<=n;i++)
    {
        cin>>s; len=s.length();
        for(int j=0;j<len;j++) if(s[j]<'a') s[j]+='a'-'A';//转小写
        mp[s]=1;//记录
    }
    getline(cin,s);//读入换行符
    getline(cin,s); len=s.length();//读入文章
    for(int i=0;i<len;i++)
    {
        if(s[i]==',') s[i]=' ';//','统一转' '
        if(s[i]!='.'&&s[i]!=' '&&s[i]<'a') s[i]+='a'-'A';//同样转小写,数字什么的反正不会出现在单词里,变不变都无所谓
    }
    int pos=0;//记录上一个分隔符在哪里
    for(int i=0;i<len;i++)
    {
        if(s[i]==' '||s[i]=='.')//如果有分隔符
        {
            t=s.substr(pos,i-pos); pos=i+1;//提出单词,更新pos
            if(!vis[t]) vis[t]=1,ans+=mp[t];//如果不重复,计算贡献
        }
        if(s[i]=='.') vis.clear();//到下一句时别忘了清空vis
    }
    printf("%d",ans);
    return 0;
}
原文地址:https://www.cnblogs.com/LLTYYC/p/9869367.html