正常会想到字典树
然鹅数据怎么小直接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; }