暴力跳的复杂度不应该是 O(n) 的吗?
查看原帖
暴力跳的复杂度不应该是 O(n) 的吗?
722313
Whiking楼主2025/7/29 09:36

就考虑维护一个 gig_i 表示 [gi,i][g_i,i] 能被删除,且 gig_i 最大。

先初始化 gig_i,枚举一个 ii,如果 si1=sis_{i-1}=s_i,那么 gi=i1g_i=i-1

其余的 gig_i 就记 x=gi1x=g_{i-1},让 xx 去一直跳: xgx1x\leftarrow g_{x-1},直到 sx1=sis_{x-1}=s_{i} 为止。

感觉每个位置至多被跳到一次啊,为什么要多乘一个字符集?

  for ( int i = 1; i <= n; i ++)
      if (s[i] == s[i - 1]) g[i] = i - 1;

  for ( int i = 1; i <= n; i ++) {
      if (g[i]) continue ;

      int x = g[i - 1];
      while (x) {
          if (s[x - 1] == s[i]) {
              g[i] = x - 1;
              break ;
          }

          x = g[x - 1];
      }
  }
2025/7/29 09:36
加载中...