• 【HNOI2004】【P1365】L语言


    tire水题,%Menci

    原题:

    标点符号的出现晚于文字的出现,所以以前的语言都是没有标点的。现在你要处理的就是一段没有标点的文章。
    一段文章T是由若干小写字母构成。一个单词W也是由若干小写字母构成。一个字典D是若干个单词的集合。我们称一段文章T在某个字典D下是可以被理解的,是指如果文章T可以被分成若干部分,且每一个部分都是字典D中的单词。
    例如字典D中包括单词{‘is’, ‘name’, ‘what’, ‘your’},则文章‘whatisyourname’是在字典D下可以被理解的,因为它可以分成4个单词:‘what’, ‘is’, ‘your’, ‘name’,且每个单词都属于字典D,而文章‘whatisyouname’在字典D下不能被理解,但可以在字典D’=D+{‘you’}下被理解。这段文章的一个前缀‘whatis’,也可以在字典D下被理解,而且是在字典D下能够被理解的最长的前缀。

    给定一个字典D,你的程序需要判断若干段文章在字典D下是否能够被理解。并给出其在字典D下能够被理解的最长前缀的位置。

    1<=n, m<=20,每个单词长度不超过10,每段文章长度不超过1M

    说了是水题了,直接建个tire,用f[i]表示一直到前i个都可以理解,如果r[i]=true,就从i开始匹配,假设到j匹配到一个单词,呢么f[j]=true

    问的是最长前缀,所以如果f[j]==true,ans=max(ans,f[j])

    刚开始看错题了,还以为是问那个串能看懂,不过就算问这个也能做,直接输出f[len-1]即可

    第一眼看题还以为是AC自动机,看了Menci题解才想到tire,也许AC自动机也能做?(我太弱了想不出来)

    话说Menci直接调用f[-1]真的好么……

    代码:

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<algorithm>
     4 #include<cstring>
     5 #include<cmath>
     6 using namespace std;
     7 int n,m;
     8 char s[1100000];  int sl;
     9 bool f[1100000];
    10 struct ddd{int num,next[26];}tire[1100000];  int ttop=0;
    11 void insert(int x,int y){
    12     int ch=s[y]-'a';
    13     if(!tire[x].next[ch]){  tire[x].next[ch]=++ttop;  tire[ttop].num=0;}
    14     if(y==sl-1){  tire[tire[x].next[ch]].num++;  return ;}
    15     insert(tire[x].next[ch],y+1);
    16 }
    17 int main(){//freopen("ddd.in","r",stdin);
    18     cin>>n>>m;
    19     while(n --> 0){//趋向于
    20         scanf("%s",s);  sl=strlen(s);
    21         insert(0,0);
    22     }
    23     while(m --> 0){//趋向于
    24         scanf("%s",s);  sl=strlen(s);
    25         memset(f,0,sizeof(f));  f[-1]=true;
    26         int ans=-1;
    27         for(int i=0;i<sl;i++)if(f[i-1]){
    28             int temp=0,ch;
    29             for(int j=i;j<sl;j++){
    30                 ch=s[j]-'a';
    31                 if(!tire[temp].next[ch])  break;
    32                 temp=tire[temp].next[ch];
    33                 if(tire[temp].num){  f[j]=true;  ans=max(ans,j);}
    34             }
    35         }
    36         cout<<ans+1<<endl;
    37     }
    38     return 0;
    39 }
    View Code
  • 相关阅读:
    青花瓷Java版
    让Broncho A1支持usbnet
    系统程序员成长计划组合的威力(三)
    【转】多CPU上的原子操作
    c#和javascript交互
    修改代码时有时会出现找不到某个组件
    UML用例建模的慨念和应用
    DJ曲二
    查询数据库里的存储过程的文本中的某个内容
    UML静态建模
  • 原文地址:https://www.cnblogs.com/JSL2018/p/5868114.html
Copyright © 2020-2023  润新知