可以先将字符串拼接一倍,注意到最小表示一定是以一个kk开头的长度为nn的字串。 于是,可以用两个指针,分别表示两个比较优化的解,然后考虑扩展。 对于当前的,如果相同,那么扩展长度;如果不同,那么长度清零,然后考虑移动指针。 对于大的,考虑移动,指针向后移动一位,进行下一轮判断。 借用OI-Wiki 的代码, k, i,...
字符串最小表示法 用于求循环同构串中字典序最小的字符串O(n²)做法将字符串a[n]扩大二倍 得到b[2 * n] 通过枚举所有起点 得到长度为n的字串 记录字典序最小的字串就可以得到字符串的最小表示 O(n)做法 例题 : AcWing 137. 雪花雪花雪花 AcWing 158. 项链...
一个字符串s的最小表示一定存在于s + s中,因为s + s包含了 s 所有的循环同构串 通过两个指针,i, j,起点分别是字符串的开头和第二个字符,即下标从0 和 1 开始 比较s[i + k] 和 s[j + k]的大小,如果从头比较到尾部都相当,说明整个字符串只有一种字符 如果不相等就从当前不相等的位置断开,比较s[...
字符串最小表示法 字符串最⼩表⽰法 给定⼀个环形字符串,显然可以有 n 种表⽰⽅法,字典序最⼩的就称为这个环的最⼩表⽰法。设 B[i] = S[i~n] + S[1~i-1],把 S 复制⼀份接到它的尾部,得到 SS,显然 B[i] = SS[i~i+n-1]。假设 B[i] 与 B[j] ⽐较,第⼀次...
最小表示法是用于解决字符串最小表示问题的方法。 循环同构: 当字符串 S 中可以选定一个位置 i 满足 则称S 与 T 循环同构 最小表示: 字符串 S 的最小表示为与 S 循环同构的所有字符串中字典序最小的字符串 算法流程: 初始化指针 i 为 0,j 为 1;初始化匹配长度 k 为 0 ...
//字符串的最小表示法#include<iostream>#include<string>usingnamespacestd;intmain(){stringstr;while(cin>>str){inti=0,j=1,k=0;intlen=str.size();while(i<len&&j<len&&k<len){//str[i+k]与str[j+k]依次进行比较intt=str[(i+k)%len]-str[(j+k)%len];//相等的情况下,k++if(t==0...
虽然说是hash表过的题但是这里我写一个最小表示过的代码 #include<bits/stdc++.h>#define fastio ios::sync_with_stdio(false);cin.tie(0)usingnamespacestd;#define int long longconstintmaxn=1e6+5;constdoublepi=acos(-1.0);constintmod=991;ints[300],ss[300];intge(ints[]){intlen=6;for(in...
首先,定义一个函数`minRepresentation`来实现字符串循环同构的最小表示法。该函数的输入参数为一个字符串`str`,输出结果为字符串的最小表示法的起始位置。 c int minRepresentation(char str[]) { int len = strlen(str); int i = 0, j = 1, k = 0; while (i < len && j < len && k < len)...
题目大意:找出一个字符串经过循环移位后生成的字符串中字典序最小的串,如果有多个,取移位最少的。原串为s,长度为n. 这里要求的其实就是这个字符串的最小表示。最小表示的思想来源于"序"的概念。比如有两个整数集合,为了判断两个集合是否相等,我们可以把每个集合中的数先排序,如果排序后的数列相等,则集合相等。