题目背景
一封好的情书需要撰写人全身心的投入。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字符。
stl->set
这题是问句子中包含多少个感动的词 ,非常水是吧 ?
然后我萌萌的交了7次AC自动机,最高分40。。才发现 妈的这题和子串一点关系没有!
三个小时的时间啊╮(╯▽╰)╭
#include <cstring> #include <cstdio> #include <queue> #define MAXN 1000010 int size=1,n,num[MAXN],trie[MAXN][27],fail[MAXN]; inline void ins(int Num,char *a) { int p=1; for(char *q=a;*q;q++) { int id=*q-'A'; if(!trie[p][id]) trie[p][id]=++size; p=trie[p][id]; } num[p]=Num; } std::queue<int>q; void build() { for(int i=0;i<=25;i++) trie[0][i]=1; q.push(1); for(;!q.empty();q.pop()) { int now=q.front(); for(int i=0;i<=25;i++) { if(trie[now][i]) { if(now==1) fail[trie[now][i]]=1; else { int tmp=fail[now]; for(;tmp;tmp=fail[tmp]) { if(trie[tmp][i]) { fail[trie[now][i]]=trie[tmp][i]; break; } } if(!tmp) fail[trie[now][i]]=1; } q.push(trie[now][i]); } } } } bool vis[MAXN]; int query(char *a,int len) { memset(vis,0,sizeof(vis)); int p=1,ans=0; for(int i=0;i<len;i++) { int id=a[i]-'A'; for(;!trie[p][id];p=fail[p]); p=trie[p][id]; int now=p; for(;now;now=fail[now]) { if(num[now]&&!vis[num[now]]) { vis[num[now]]=1; ans++; } } } return ans; } int main() { scanf("%d",&n); char word[55],a[1005]; for(int i=1;i<=n;i++) { scanf("%s",word); for(int j=0;j<strlen(word);j++) if(word[j]>='a'&&word[j]<='z') word[j]-=32; ins(i,word); } build(); int k=0,ans=0; char ch=getchar(); for(;scanf("%c",&ch)==1;) { if(ch==' ') break; else if(ch=='.') ans+=query(a,k),k=0; else if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')) { if(ch>='a'&&ch<='z') a[k]=ch-32; else a[k]=ch; k++; } else continue; } printf("%d",ans); return 0; }
#include <algorithm> #include <iostream> #include <cstdio> #include <string> #include <set> using namespace std; set<string>se,se2; int ans,n; int main() { scanf("%d",&n); string a; for(int i=1;i<=n;i++) { cin>>a; for(int i=0;i<a.length();i++) if(a[i]>='a'&&a[i]<='z') a[i]-=32; se.insert(a); } char ch=getchar(); string b; while(scanf("%c",&ch)==1) { if(ch==' ') break; if((ch>='A'&&ch<='Z')||(ch>='a'&&ch<='z')) { if(ch>='a'&&ch<='z') ch=ch-32; b+=ch; } else { if(!b.empty()) { if(se.count(b)) se2.insert(b); b.clear(); } if(ch=='.') ans+=se2.size(),se2.clear(); } } printf("%d ",ans); return 0; }