zoukankan      html  css  js  c++  java
  • BZOJ1212 [HNOI2004]L语言

    Description

    标点符号的出现晚于文字的出现,所以以前的语言都是没有标点的。现在你要处理的就是一段没有标点的文章。 一段文章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下能够被理解的最长前缀的位置。

    Input

    输入文件第一行是两个正整数n和m,表示字典D中有n个单词,且有m段文章需要被处理。 之后的n行每行描述一个单词,再之后的m行每行描述一段文章。 其中1<=n, m<=20,每个单词长度不超过10,每段文章长度不超过1M。

    Output

    对于输入的每一段文章,你需要输出这段文章在字典D可以被理解的最长前缀的位置。

    Sample Input

    4 3
    is
    name
    what
    your
    whatisyourname
    whatisyouname
    whaisyourname

    Sample Output

    14
    6
    0 整段文章’whatisyourname’都能被理解
    前缀’whatis’能够被理解
    没有任何前缀能够被理解

    题解

    将字典建Trie,然后dp:$f_i$表示前$i$个字母的串能否被理解,那么转移时用填表法在Trie树上跑就行了。

    附代码:

    #include <cstdio>
    #include <cstring>
    const int N = 250, M = 1000050;
    int nxt[N][26];
    bool t[N];
    int cnt = 1;
    bool f[M];
    char s[M];
    void addStr() {
      int l = strlen(s), v = 0;
      for (int i = 0; i < l; ++i) {
        if (!nxt[v][s[i] - 'a'])
          nxt[v][s[i] - 'a'] = cnt++;
        v = nxt[v][s[i] - 'a'];
      }
      t[v] = 1;
    }
    int solve() {
      int n = strlen(s), ans;
      f[0] = 1;
      for (int i = 1; i <= n; ++i) f[i] = 0;
      for (int i = 0; i <= n; ++i) if (f[i]) {
        ans = i;
        int v = 0;
        for (int j = i; j <= n; ++j) {
          if (t[v]) f[j] = 1;
          if (j == n || !(v = nxt[v][s[j] - 'a'])) break;
        }
      }
      return ans;
    }
    int main() {
      int n, m;
      scanf("%d%d", &n, &m);
      while (n--) scanf("%s", s), addStr();
      while (m--) scanf("%s", s), printf("%d
    ", solve());
      return 0;
    }
    

      

  • 相关阅读:
    二分图最大匹配的K&#246;nig定理及其证明
    HDOJ 2389 Rain on your Parade
    HDOJ 1083 Courses
    HDOJ 2063 过山车
    POJ 1469 COURSES
    UESTC 1817 Complete Building the Houses
    POJ 3464 ACM Computer Factory
    POJ 1459 Power Network
    HDOJ 1532 Drainage Ditches
    HDU 1017 A Mathematical Curiosity
  • 原文地址:https://www.cnblogs.com/y-clever/p/7028970.html
Copyright © 2011-2022 走看看