1 条题解

  • 1
    @ 2022-8-31 9:26:02
    namespace Fusu {
    
    const int maxt = 26;
    const int maxn = 2000005;
    
    void Init();
    void Build();
    void Solve();
    
    void Main() {
      Init();
      Build();
      Solve();
    }
    
    int n, q;
    int len[maxn];
    char s[maxn];
    
    struct Node {
      bool isend;
      unsigned mch, depth;
      Node *fail;
      Node *trans[maxt];
    
      Node() : isend(false), mch(0), depth(0), fail(nullptr) {
        memset(trans, 0, sizeof trans);
      }
    
      void calc() {
        mch = fail->mch;
        if (isend) mch |= 1u << depth;
      }
    };
    Node *rot;
    
    void Init() {
      scanf("%d%d", &n, &q);
      rot = new Node;
      for (int i = 1; i <= n; ++i) {
        scanf("%s", s + 1);
        len[i] = strlen(s + 1);
        auto u = rot;
        for (int j = 1, x = s[j] - 'a'; j <= len[i]; x = s[++j] - 'a') {
          u = u->trans[x] ? u->trans[x] : (u->trans[x] = new Node());
        }
        u->isend = true;
      }
    }
    
    std::queue<Node*> Q;
    void Build() {
      for (auto &u : rot->trans) if (u != nullptr) {
        u->fail = rot;
        u->depth = 1;
        Q.push(u);
      } else {
        u = rot;
      }
      for (Node *u, *v; !Q.empty(); Q.pop()) {
        u = Q.front();
        u->calc();
        for (int i = 0; i < maxt; ++i) if ((v = u->trans[i]) != nullptr) {
          v->depth = u->depth + 1;
          v->fail = u->fail->trans[i];
          Q.push(v);
        } else {
          u->trans[i] = u->fail->trans[i];
        }
      }
    }
    
    void Solve() {
      while (q--) {
        int ans = 0;
        unsigned tmp = 1;
        scanf("%s", s + 1);
        int m = strlen(s + 1);
        auto u = rot;
        for (int i = 1, x = s[i] - 'a'; i <= m; x = s[++i] - 'a') {
          if (((u = u->trans[x])->mch) & (tmp <<= 1)) {
            tmp |= 1;
            ans = i;
          }
        }
        qw(ans, '\n');
      }
    }
    
    } 
    
    • 1

    信息

    ID
    1212
    时间
    1000ms
    内存
    256MiB
    难度
    4
    标签
    (无)
    递交数
    27
    已通过
    15
    上传者