• 洛谷 P2264 情书


    题目背景

    一封好的情书需要撰写人全身心的投入。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;
    }
    萌萌的40分AC自动机
    #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;
    }
    我们都在命运之湖上荡舟划桨,波浪起伏着而我们无法逃脱孤航。但是假使我们迷失了方向,波浪将指引我们穿越另一天的曙光。
  • 相关阅读:
    小艾电台-小众音乐科普讲座
    永乐计分器
    顺金斗花牌-比大小
    Bigger_0305
    iTunes Connect后台无法创建App的解决方案
    iOS navigationBar导航栏底部与self.view的分界线的隐藏
    iOS 十六进制的相加取反
    UITabBar-UITabBarItem图片的背景颜色属性和文字的颜色大小设置
    iOS GCD多线程介绍
    [POJ3461] Oulipo
  • 原文地址:https://www.cnblogs.com/ruojisun/p/7358775.html
Copyright © 2020-2023  润新知