码迷,mamicode.com
首页 > 其他好文 > 详细

P2264 情书 Trie匹配

时间:2018-12-08 20:18:55      阅读:179      评论:0      收藏:0      [点我收藏+]

标签:col   continue   long   trie树   水过   区分   超过   输入   printf   

\(\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匹配

标签:col   continue   long   trie树   水过   区分   超过   输入   printf   

原文地址:https://www.cnblogs.com/olinr/p/10088838.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!