• 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;
    }
  • 相关阅读:
    软件设计中的立足点
    Clojure基础
    团队凝聚力
    执行力与领导力
    工作与生活
    分离焦虑OR责任焦虑
    保持激情
    立足点
    论研发管理--开篇
    初级码农常犯错误
  • 原文地址:https://www.cnblogs.com/LLTYYC/p/9869367.html
Copyright © 2020-2023  润新知