Background
一封好的情書須要撰寫人全身心的投入。CYY同窗看上了可愛的c**想對她表白,但殊不知道本身寫的情書是否能感動她,如今他帶着情書請你來幫助他。ios
Description
爲了幫助CYY,咱們定義一個量化情書好壞的標準感動值。判斷感動值的方法以下:git
1.在情書的一句話中若含有給定詞彙列表中的特定單詞,則感動值加1,但每一單詞在同一句話中出現屢次感動值不疊加,不一樣單詞不受影響。保證輸入的單詞不重複。spa
2.每句話以英文句號定界。code
3.全文不區分大小寫。ip
Input
第一行包含一個數字n,表示致使感動值提高的詞彙列表中單詞的數量,隨後n行是給定單詞,每行一個。保證單詞只包含英文字母。get
最後一行爲情書正文,保證只包含如下幾種字符: 英文字母、數字、空格、英文逗號、英文句號。input
Output
一個數字g,表示情書帶來的感動值。it
這題先要讀清題好吧 emm。io
每一單詞在同一句話中出現屢次,感動值不增長.
class
這個同一句話就是嚴格的同一句話.就是遇到'.'纔算一句話。
還記得我當年寫情書的時候,那時候.....
咱們用\(Trie\)樹來解決這一個匹配問題.
"爲何不用\(AC\)自動機",
"我太弱了 ,用不來。
所以,我用了\(Trie\)樹.
咱們對\(n\)個串構建\(Trie\)樹.
對於情書中的,遇到一個標點符號(題目中的,空格,逗號,句號)就查詢一次.
判斷是否重複出現,就標記某個單詞以前出如今哪一個句子中便可.
咱們每遇到一個句號,就將句子數量\(++\)。
統計答案的時候判斷\(val[u]==cnt\)便可。
若是相同,那他們就在同一個句子中,\(return \ false\)
PS:返回\(true\)的條件還有,這個單詞在\(Trie\)樹中出現過.
讀入很毒瘤!!!
樣例沒出可是A了QWQ
代碼
#include<cstdio> #include<iostream> #include<algorithm> #define R register using namespace std; const int maxn=5008; inline void in(int &x) { int f=1;x=0;char s=getchar(); while(!isdigit(s)){if(s=='-')f=-1;s=getchar();} while(isdigit(s)){x=x*10+s-'0';s=getchar();} x*=f; } int idx,val[maxn*15],ans,cnt=1,n,len; char tri[maxn*15][26],s[maxn]; inline void insert(R char *s,R int len) { R int u=0; for(R int i=1;i<=len;i++) { R int v=s[i]-'a'; if(!tri[u][v])tri[u][v]=++idx; u=tri[u][v]; } val[u]=20011003; } inline bool query(R char *s,R int len) { R int u=0; for(R int i=1;i<=len;i++) { R int v=s[i]-'a'; if(!tri[u][v] or s[i]>'z' or s[i]<'a') return false; u=tri[u][v]; } if(val[u]!=cnt and val[u]) { val[u]=cnt; return true; } return false; } int main() { in(n); char c; for(R int i=1;i<=n;i++) { len=0; while((c=getchar())!='\n' and c!=' ') { if(c>='A' and c<='Z')c=c-'A'+'a'; s[++len]=c; } insert(s,len); } len=0; while((c=getchar())!=EOF) { if(c==' ' or c=='.' or c==',') { if(query(s,len))ans++; len=0; cnt=cnt+(c=='.'); continue; } if(c>='A' and c<='Z')c=c-'A'+'a'; s[++len]=c; } if(query(s,len)) ans++; printf("%d",ans); }