后缀数组

Luogu
IDLGP10469
Time2000ms
Memory512MB
DifficultyP4
字符串倍增二分排序哈希 hashing
后缀数组 (SA) 是一种重要的数据结构,通常使用倍增或者 DC3 算法实现,这超出了我们的讨论范围。 在本题中,我们希望使用快排、Hash 与二分实现一个简单的 $O(n\log^2n)$ 的后缀数组求法。 详细地说,给定一个长度为 $n$ 的字符串 $S$(下标 $0 \sim n-1$),我们可以用整数 $k(0 \le k < n)$ 表示字符串 $S$ 的后缀 $S(k \sim n-1)$。 把字符串 $S$ 的所有后缀按照字典序排列,排名为 $i$ 的后缀记为 SA[i]。 额外地,我们考虑排名为 $i$ 的后缀与排名为 $i-1$ 的后缀,把二者的最长公共前缀的长度记为 Height[i]。 我们的任务就是求出 SA 与 Height 这两个数组。 ## Input 输入一个字符串,其长度不超过 $30$ 万。 字符串由小写字母构成。 ## Output 第一行为数组 SA,相邻两个整数用 $1$ 个空格隔开。 第二行为数组 Height,相邻两个整数用 $1$ 个空格隔开,我们规定 Height[1]=0。 [samples]
Samples
Input #1
ponoiiipoi
Output #1
9 4 5 6 2 8 3 1 7 0
0 1 2 1 0 0 2 1 0 2
API Response (JSON)
{
  "problem": {
    "name": "后缀数组",
    "description": {
      "content": "后缀数组 (SA) 是一种重要的数据结构,通常使用倍增或者 DC3 算法实现,这超出了我们的讨论范围。 在本题中,我们希望使用快排、Hash 与二分实现一个简单的 $O(n\\log^2n)$ 的后缀数组求法。 详细地说,给定一个长度为 $n$ 的字符串 $S$(下标 $0 \\sim n-1$),我们可以用整数 $k(0 \\le k < n)$ 表示字符串 $S$ 的后缀 $S(k \\sim n",
      "description_type": "Markdown"
    },
    "platform": "Luogu",
    "limit": {
      "time_limit": 2000,
      "memory_limit": 524288
    },
    "difficulty": {
      "LuoguStyle": "P4"
    },
    "is_remote": true,
    "is_sync": true,
    "sync_url": null,
    "sign": "LGP10469"
  },
  "statements": [
    {
      "statement_type": "Markdown",
      "content": "后缀数组 (SA) 是一种重要的数据结构,通常使用倍增或者 DC3 算法实现,这超出了我们的讨论范围。\n\n在本题中,我们希望使用快排、Hash 与二分实现一个简单的 $O(n\\log^2n)$ 的后缀数组求法。\n\n详细地说,给定一个长度为 $n$ 的字符串 $S$(下标 $0 \\sim n-1$),我们可以用整数 $k(0 \\le k < n)$ 表示字符串 $S$ 的后缀 $S(k \\sim n...",
      "is_translate": false,
      "language": "English"
    }
  ]
}
Full JSON Raw Segments