题目背景
一封好的情书需要撰写人全身心的投入。lin_toto同学看上了可爱的卡速米想对她表白,但却不知道自己写的情书是否能感动她,现在他带着情书请你来帮助他。
题目描述
为了帮助lin_toto,我们定义一个量化情书好坏的标准感动值。判断感动值的方法如下:
1.在情书的一句话中若含有给定词汇列表中的特定单词,则感动值加1,但每一单词在同一句话中出现多次感动值不叠加,不同单词不受影响。保证输入的单词不重复。
2.每句话以英文句号定界。
3.全文不区分大小写。
输入输出格式
输入格式:第一行包含一个数字n,表示导致感动值提升的词汇列表中单词的数量,随后n行是给定单词,每行一个。保证单词只包含英文字母。
最后一行为情书正文,保证只包含以下几种字符: 英文字母、数字、空格、英文逗号、英文句号。
输出格式:一个数字g,表示情书带来的感动值。
输入输出样例
输入样例#1:
3 love so much I love you so much.
输出样例#1:
3
说明
对于所有的数据,保证1 ≤ n,m,k ≤ 100,每个单词不超过50字符,全文不超过1000字符。
思路
hash+map;
代码实现
1 #include<map> 2 #include<cstdio> 3 #define ULL unsigned long long 4 int n,ans; 5 char ch[60],cn[1010]; 6 std::map<ULL,int>vis; 7 std::map<ULL,bool>end; 8 void hash(){ 9 scanf("%s ",ch); 10 for(ULL i=0,j=1;;i++){ 11 if(ch[i]>='a'&&ch[i]<='z') ch[i]-=32; 12 if(!ch[i]){ 13 end[j]=true; 14 return; 15 } 16 j=j*197+ch[i]; 17 } 18 } 19 void find(){ 20 int num=1; 21 for(ULL i=0,j=1;cn[i];i++){ 22 if(cn[i]==','||cn[i]==' '||cn[i]=='.'){ 23 if(end[j]&&vis[j]<num) vis[j]=num,ans++; 24 if(cn[i]=='.') num++; 25 j=1; 26 continue; 27 } 28 if(cn[i]>='a'&&cn[i]<='z') cn[i]-=32; 29 j=j*197+cn[i]; 30 } 31 } 32 int main(){ 33 scanf("%d",&n); 34 for(int i=1;i<=n;i++) hash(); 35 gets(cn); 36 find(); 37 printf("%d ",ans); 38 return 0; 39 }
我一开始,一个AC自动机糊T了20分。。。