zoukankan      html  css  js  c++  java
  • 最小表示法

    最小表示法

    O(n)找到字典序最小的循环串

    做法

    先把串复制一遍,维护指针ij表示[0,max(i,j)-1]中除min(i,j)均不合法,再维护匹配了k位

    (此时min(i,j)不一定合法,但这样的话min(i,j)一定会跳到和另一个交换为止,则另一个会变为新的min,这样就合法了)

    直接顺序匹配s[i+k],s[j+k],若s[i+k]>s[j+k]则显然[i,i+k]均不合法(因为[j,j+k]对应更优),所以i->i+k+1

    当i>=n/j>=n就结束,此时只剩一个合法串

    注意有i=j的时候,此时若s[i+1]<s[i]则+1,否则把i+1->j(即右移到能放指针j为止)

    code

    洛谷模板

    i=0,j=1,k=0;
    while (i<n && j<n && k<n)
    {
    	if (a[i+k]==a[j+k]) ++k;
    	else
    	{
    		if (a[i+k]>a[j+k]) i=i+k+1;
    		else j=j+k+1;
    		k=0;
    	}
    	if (i==j)
    	{
    		while (i+1<n && a[i]>a[i+1]) ++i,++j;
    		++j;
    	}
    }
    
  • 相关阅读:
    NPOI 操作 excel 帮助类
    文件帮助类
    浮点数精度问题
    多段文本显示省略号
    数字排序
    删除字符串首位空格
    生成一定范围的随机数
    锚链接动画
    原生js转json
    弹出遮罩和对话框
  • 原文地址:https://www.cnblogs.com/gmh77/p/14372707.html
Copyright © 2011-2022 走看看