【发布时间】:2015-09-08 10:44:51
【问题描述】:
当允许重复子字符串时,我想找到给定字符串的字典序上第 K 个最小的子字符串。
假设给定一个字符串abc,那么它的子字符串按字典顺序是{a,ab,abc,b,c},现在假设给定K = 3 那么ans就是abc。
现在假设给定字符串 aaa 那么它的所有子字符串都是 {a,a,a,aa,aaa,aa} 所以现在如果 K = 4 那么我们输出 aa。
但是,我在 codeforces 上遇到了以下代码,但我无法理解。非常感谢任何帮助。
char s [MaxN];
bool b [MaxN];
int k, n;
void solve (vector <int> v)
{
int i, j;
int64 p, q;
char c;
vector <int> w;
for (c = 'a'; c <= 'z'; c++)
{
p = q = 0;
w.clear ();
for (j = 0; j < (int) v.size (); j++)
{
i = v[j];
if (s[i] == c)
{
w.push_back (i + 1);
p++;
q += n - i;
}
}
if (k < q)
break;
k -= q;
}
assert (c <= 'z');
putchar (c);
if (k < p)
return;
k -= p;
solve (w);
}
int main (void)
{
int i;
while (scanf (" %s %d", s, &k) != EOF)
{
n = (int) strlen (s);
if (k > ((((int64) n) * (int64) (n + 1)) >> 1LL))
{
printf ("No such line.\n");
continue;
}
k--;
vector <int> v;
for (i = 0; i < n; i++)
v.push_back (i);
solve (v);
putchar ('\n');
}
return 0;
}
【问题讨论】:
-
代码中是否有部分你不知道它的意思?您是否尝试过通过一些简单的案例逐步了解它的作用?
-
我尝试在一些小测试用例上运行它,但在大多数情况下,我迷失在两者之间,也无法弄清楚背后的想法。任何新想法都同样受欢迎
标签: c++ string suffix-array