partychicken
2019-03-01 10:10:15
最小表示法是用于解决字符串最小表示问题的方法(废话
当字符串
则称
字符串
我们直接比较与
每次保留当前字典序最小的字符串与剩余的字符串比较。
int k=0,i=0,j=1;
for(;j<n;j++)
{
if(sec[(i+k)%n]==sec[(j+k)%n])
{
k++;
}
else
{
if(sec[(i+k)%n]>sec[(j+k)%n]%n)
{
i=j;
}
k=0;
}
}
随机数据下表现良好,但是可以构造特殊数据卡掉。
例如:对于
我们发现,当字符串中出现多个连续重复子串时,此算法效率降低,我们考虑优化这个过程。
考虑对于一对字符串
不妨先考虑
所以我们比较时可以跳过下标
这样,我们就完成了对于上文暴力的优化。
证明:显然
int k=0,i=0,j=1;
while(k<n&&i<n&&j<n)
{
if(sec[(i+k)%n]==sec[(j+k)%n])
{
k++;
}
else
{
sec[(i+k)%n]>sec[(j+k)%n]?i=i+k+1:j=j+k+1;
if(i==j) i++;
k=0;
}
}
i=min(i,j);