Trie樹【p2264】情書

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);
}
相關文章
相關標籤/搜索