【模板】字符串算法-字符串最小表示法

来源:互联网 发布:淘宝双十一促销方案 编辑:程序博客网 时间:2024/06/05 07:56

2014年10月,刚进hdu参加新生赛的时候,就遇到了字符串最小表示法的裸题,然而那时什么都不会的我只得写暴力,自然TLE了。之后在湖南师范大学第六届大学生计算机程序设计竞赛2B上,又做到了同样的裸题。


/*字符串算法-字符串最小表示法模板这是一个可以用O(n)时间解决"字符串呈环状,每一位置都可以作为首位,找出以哪个位置为开头,可以使得这个字符串的字典序最小(或最大)"问题的算法。*/#include<stdio.h>#include<string.h>const int M=5e6+10;int casenum,casei;int p;char a[M];int getmin(char s[]){    int i=0,j=1,k=0;//i和j是两个进行比较的起始匹配位点,k是匹配长度    int len=strlen(s);    while(i<len&&j<len&&k<len)    {        int t=s[(i+k)%len]-s[(j+k)%len];//比较两个串的大小关系        if(t==0)k++;//如果相同,匹配长度增大,比较位置向移        else //如果不同,则字典序大的位置肯定不会是答案,改变那个匹配位点        {            if(t>0)i+=k+1;            else j+=k+1;            if(i==j)j++;//i和j一定要错开            k=0;//匹配长度要重置为0        }    }    return i<j?i:j;//因为字典序大的位置被后移了,所以较小的位置就是答案}int main(){    scanf("%d",&casenum);    while(casenum--)    {        scanf("%s",a);        p=getmin(a);        printf("%d\n",p);    }}/*【题意】字符串呈环状,每一位置都可以作为首位,以哪个位置为开头,可以使得这个字符串的字典序最小(或最大)?【类型】字符串算法-字符串最小表示法【分析】这个算法其实自己想也能想出来。因为就算是自己设计的话,也应当是——把这个字符串的0号位点与1号位点相比较,如果一样,继续向后延伸比较,如果不一样,肯定大的那个显然不会是答案,改变匹配串。这里其实唯一需要理解的地方就是——if(t>0)i+=k+1;else j+=k+1;为什么这里是变成k+1,中间的内容可以完全跳过呢?(比如t>0)因为我们已经有{s[i]~s[i+k-1]==s[j]~s[j+k-1]了,且有s[i+k]>s[j+k],自然我们选i~i+k中的任意一点都是比j~j+k的相应位置要差的,所以自然可以都略过}【时间复杂度&&优化】i,j,k在某个位点都最多从0走到len,所以时间复杂度为O(n)【trick】【数据】Sample Input4bcda aaaaadabSample Output3002*/

ps:这套题虽然质量不高,还有两道错题2333,但是有三道裸题(2B字符串最小表示法、3C网络流和6F矩阵快速幂),对这些算法生疏的ACMer,可以拿来练手哦~~

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 肚子胀反胃想吐怎么办 脸上干皮特别多怎么办 月光足还不了款怎么办 孩子不爱和小朋友玩怎么办 不知道怀孕抽烟了怎么办 校园欺凌来了该怎么办 拉的屎是绿色的怎么办 生完孩子痔疮痛怎么办 生过孩子脱肛该怎么办 生完宝宝有痔疮怎么办 毎次大便都脱肛怎么办 怀孕快生了便秘怎么办 35周孕晚期便秘怎么办 怀孕了老公出轨了怎么办 婆婆跟老公睡了怎么办 婆婆和老公互黏怎么办 15岁就掉头发怎么办 24岁经常掉头发怎么办 舍友打游戏太吵怎么办 家里的地砖想换怎么办 墙上的瓷砖掉了怎么办 瓷砖掉了一块瓷怎么办 白色裙子太透了怎么办 剑三石头插错了怎么办 四六级证书丢了怎么办 当月发票冲红了怎么办 当月发票红冲了怎么办 作废的发票扔了怎么办 发票公章盖错了怎么办 发票章盖的模糊怎么办 下的电影没字幕怎么办 荣耀8下载东西慢怎么办 考科目二下大雨怎么办 不求上进的人怎么办 连锁经营投的钱怎么办 古曼丽不想养了怎么办 百度云上传太慢怎么办 手机视频拍倒了怎么办 老师收手机不给怎么办 云盘视频被和谐怎么办 我喜欢上两个人怎么办