P2264 情书 Trie匹配

Posted olinr

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P2264 情书 Trie匹配相关的知识,希望对你有一定的参考价值。

(color{#0066ff}{题目描述})

为了帮助CYY,我们定义一个量化情书好坏的标准感动值。判断感动值的方法如下:

1.在情书的一句话中若含有给定词汇列表中的特定单词,则感动值加1,但每一单词在同一句话中出现多次感动值不叠加,不同单词不受影响。保证输入的单词不重复。

2.每句话以英文句号定界。

3.全文不区分大小写。

(color{#0066ff}{输入格式})

第一行包含一个数字n,表示导致感动值提升的词汇列表中单词的数量,随后n行是给定单词,每行一个。保证单词只包含英文字母。

最后一行为情书正文,保证只包含以下几种字符: 英文字母、数字、空格、英文逗号、英文句号。

(color{#0066ff}{输出格式})

一个数字g,表示情书带来的感动值。

(color{#0066ff}{输入样例})

3
love
so
much
I love you so much.

(color{#0066ff}{输出样例})

3

(color{#0066ff}{数据范围与提示})

对于所有的数据,保证1 ≤ n,m,k ≤ 100,每个单词不超过50字符,全文不超过1000字符。

(color{#0066ff}{题解})

这题很水对不对? 随便模拟STL什么的轻松水过

我就是想练练Trie树

不知道是不是第一次写情书的缘故,这。。。

技术分享图片

你Tm玩我呢!!!!

完美入坑!!!

1、按题目要求,必须整个单词匹配,是原文的字串不算

2、输入有逗号,要考虑

3、有一个点行末没有换行符,那么这个单词合法,有换行符不合法@@@@

4、不区分大小写!!!

5、写指针要写构造函数或初始化!!

6、时刻注意数组越界问题

#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
#include<algorithm>
#include<cmath>
#define _ 0
#define LL long long
inline LL in()
{
    LL x=0,f=1; char ch;
    while(!isdigit(ch=getchar()))(ch=='-')&&(f=-f);
    while(isdigit(ch)) x=x*10+(ch^48),ch=getchar();
    return x*f;
}
struct node
{
    node *ch[26];
    int tag;
    node()
    {
        for(int i=0;i<=25;i++) ch[i]=NULL;
        tag=0;
    }
    void *operator new (size_t)
    {
        static node *S=NULL,*T=NULL;
        return (S==T&&(T=(S=new node[1024])+1024),S++);
    }
};
int n;
char s[1200];
int len,cnt=1;
struct Trie
{
    node *root;
    Trie() {root=new node();}
    void ins()
    {
        char ch;
        node *o=root;
        while(!isalpha(ch=getchar()));
        while(isalpha(ch))
        {
            ch=tolower(ch);
            int p=ch-'a';
            if(o->ch[p]==NULL) o->ch[p]=new node();
            o=o->ch[p];
            ch=getchar();
        }
        o->tag=-1;
    }
    bool have(int l,int r)
    {
        node *o=root;
        for(int i=l;i<=r;i++)
        {
            int p=s[i]-'a';
            if(!isalpha(s[i])||!o->ch[p]) return false;
            o=o->ch[p];
        }
        if(o->tag==cnt||!o->tag) return false;
        return o->tag=cnt,true;
    }
    void query()
    {
        int ans=0;
        char ch;
        while((ch=getchar())!=EOF)
        {
            ch=tolower(ch);
            if(ch==' '||ch=='.'||ch==',')
            {   
                ans+=have(1,len);
                if(ch=='.') cnt++;
                len=0; 
                continue;
            }
            s[++len]=ch;
        }
        ans+=have(1,len);
        printf("%d",ans);
    }
}t;
int main()
{
    n=in();
    for(int i=1;i<=n;i++) t.ins();
    t.query();
    return 0;
}

以上是关于P2264 情书 Trie匹配的主要内容,如果未能解决你的问题,请参考以下文章

洛谷 P2264 情书

P2264 情书(字符串hash90分)

题解 LG P2264

Vijos P1028 魔族密码(Trie解法)

P2264 ??????

大学生程序猿IT情书“2014爱的告白挑战赛”获奖名单及优秀情书展示系列之 - 三行代码情书