提交记录 3754


用户 题目 状态 得分 用时 内存 语言 代码长度
jhdjames37 noi18c. 【NOI2018】你的名字 Time Limit Exceeded 28 4 s 294192 KB C++ 3.92 KB
提交时间 评测时间
2018-07-18 17:18:28 2020-07-31 21:31:01
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
const int MAXN = 1e6 + 10;

char s[MAXN], t[MAXN];
int n, m, q;
namespace solver1 {
  namespace sam {
    const int SIZE = 2e6;
    struct Node {
      int tranc[26];
      int fa, dep;
      int ver, cnt, to;
    }tree[SIZE];
    int root, cnt, tail, tot;
    int tot_time;
    std::vector <int> pts;
    Node backup[MAXN];
    void insert(int x) {
      int p = tail, np = ++cnt;
      tree[np].dep = tree[p].dep + 1;
      for (; p && !tree[p].tranc[x]; p = tree[p].fa) tree[p].tranc[x] = np;
      if (!p) {
        tree[np].fa = root;
      } else {
        int q = tree[p].tranc[x];
        if (tree[q].dep == tree[p].dep + 1) {
          tree[np].fa = q;
        } else {
          int nq = ++cnt;
          tree[nq] = tree[q];
          tree[nq].dep = tree[p].dep + 1;
          tree[q].fa = tree[np].fa = nq;
          for (; p && tree[p].tranc[x] == q; p = tree[p].fa) tree[p].tranc[x] = nq;
        }
      }
      tail = np;

    }
    void init() {
      tail = root = cnt = 1;
      
      for (int i = 1; i <= n; i++) {
        insert(s[i] - 'a');
      }

      for (int i = 1; i <= cnt; i++) {
        tree[i].cnt = 1;
        tree[i].to = i;
      }
      tot = cnt;
      std::copy(tree + 1, tree + cnt + 1, backup + 1);
    }
    void copy_node(int &x) {
      return;
      if (tree[x].ver != tot_time) {
        int u = ++cnt;
        tree[u] = tree[x];
        tree[u].ver = tot_time;
        tree[u].to = u;
        
        tree[x].ver = tot_time;
        tree[x].to = u;
        
        
        if (x == root) {
          root = u;
        }
        x = u;
      } else {
        x = tree[x].to;
      }
    }
    
    int newnode() {
      int u = ++cnt;
      memset(tree + u, 0, sizeof tree[u]);
      tree[u].ver = tot_time;
      pts.push_back(u);
      return u;
    }
    void insert2(int x) {
      int p = tail, np;
      if (!tree[p].tranc[x]) {
        np = newnode();
      } else {
        np = tree[p].tranc[x];

        if (tree[np].dep != tree[p].dep + 1) {
          copy_node(np);
          int nq = newnode();
          tree[nq] = tree[np];
          tree[nq].dep = tree[p].dep + 1;
          tree[np].fa = nq;
          for (; p && tree[p].tranc[x] == np; p = tree[p].fa) {
            copy_node(p);
            tree[p].tranc[x] = nq;
          }
         
          tail = nq;
        } else {
          tail = np;
        }
        return;
      }
      
      tree[np].dep = tree[p].dep + 1;
      for (; p && !tree[p].tranc[x]; p = tree[p].fa) {
        copy_node(p);
        tree[p].tranc[x] = np;
      }
      
      if (!p) {
        tree[np].fa = root;
      } else {
        int q = tree[p].tranc[x];
        if (tree[q].dep == tree[p].dep + 1) {
          tree[np].fa = q;
        } else {
          int nq = newnode();
          tree[nq] = tree[q];
          tree[nq].dep = tree[p].dep + 1;
          copy_node(q);
          tree[q].fa = tree[np].fa = nq;
          for (; p && tree[p].tranc[x] == q; p = tree[p].fa) {
            copy_node(p);
            tree[p].tranc[x] = nq;
          }
        }
      }
      tail = np;
    }
    
    long long query() {
      ++tot_time;
      cnt = tot;
      root = 1;
      tail = root;
      std::copy(backup + 1, backup + cnt + 1, tree + 1);

      pts.clear();
      
      for (int i = 1; i <= m; i++) {
        insert2(t[i] - 'a');
      }

      long long ans = 0;
      for (int i = 0; i < (int) pts.size(); i++) {

        int k = pts[i];
        if (!tree[k].cnt) {
          ans += tree[k].dep - tree[tree[k].fa].dep;
        }
      }


      return ans;
    }
    
  }
  void main() {
    sam::init();
    while(q--) {
      int l, r;
      scanf("%s%d%d", t + 1, &l, &r);
      m = strlen(t + 1);
      printf("%lld\n", sam::query());
    }
  }
}

int main() {
  //freopen("name.in", "r", stdin);
 //freopen("name.out", "w", stdout);
  scanf("%s", s + 1);
  n = strlen(s + 1);
  scanf("%d", &q);
  solver1::main();
  
}

CompilationN/AN/ACompile OKScore: N/A

Testcase #11.913 ms160 KBAcceptedScore: 4

Testcase #23.124 ms464 KBAcceptedScore: 4

Testcase #33.232 ms468 KBAcceptedScore: 4

Testcase #426.495 ms956 KBAcceptedScore: 4

Testcase #525.64 ms944 KBAcceptedScore: 4

Testcase #6137.53 ms287 MB + 304 KBAcceptedScore: 4

Testcase #7137.326 ms287 MB + 256 KBAcceptedScore: 4

Testcase #84 s40 MB + 852 KBTime Limit ExceededScore: 0

Testcase #94 s33 MB + 412 KBTime Limit ExceededScore: 0

Testcase #104 s76 MB + 64 KBTime Limit ExceededScore: 0

Testcase #114 s66 MB + 452 KBTime Limit ExceededScore: 0

Testcase #124 s111 MB + 296 KBTime Limit ExceededScore: 0

Testcase #134 s101 MB + 780 KBTime Limit ExceededScore: 0

Testcase #144 s147 MB + 884 KBTime Limit ExceededScore: 0

Testcase #154 s138 MB + 20 KBTime Limit ExceededScore: 0

Testcase #164 s184 MB + 536 KBTime Limit ExceededScore: 0

Testcase #174 s175 MB + 132 KBTime Limit ExceededScore: 0

Testcase #184 s84 MB + 972 KBTime Limit ExceededScore: 0

Testcase #194 s117 MB + 424 KBTime Limit ExceededScore: 0

Testcase #204 s150 MB + 504 KBTime Limit ExceededScore: 0

Testcase #214 s184 MB + 768 KBTime Limit ExceededScore: 0

Testcase #224 s184 MB + 472 KBTime Limit ExceededScore: 0

Testcase #234 s184 MB + 360 KBTime Limit ExceededScore: 0

Testcase #244 s184 MB + 716 KBTime Limit ExceededScore: 0

Testcase #254 s184 MB + 780 KBTime Limit ExceededScore: 0


Judge Duck Online | 评测鸭在线
Server Time: 2026-04-18 01:09:38 | Loaded in 2 ms | Server Status
个人娱乐项目,仅供学习交流使用 | 捐赠