解法一:直接暴力利用string的compare和substr
(這樣竟然也能過,哭了)
#include
#include
#include
using
namespace std;
intmain()
}printf
("%d\n"
,minpos+1)
;}return0;
}
解法二:最小表示法
用於求乙個字串首尾相連時的最小字典序
模版:
i=
0,j=1;
while
(i<=n&&j<=n)
else
} i=
min(i,j)
;
意思就是從i=0、j=1開始,k=0
①如果s[i+k]s[j+k],則k++;
②如果s[i+k]>s[j+k],則i=i+k+1;若ij,則i++;
③如果s[i+k]s[j+k],此時要讓i=i+k+1。那我們直接證明在i到i+k之間不存在最小字典序的字串就好,取中間一點為i+p,因為s[i+k]>s[j+k],s[i+p]到s[i+k-1]與s[j+p]到s[j+k-1]相同,那麼i+p到i+k字典序一定是大於j+p到j+k的,所以可以直接讓i跳到i+k+1處。
③的證明也同理。
#include
#include
#include
using
namespace std;
intmain()
else
} cout<<
min(i,j)+1
<}return0;
}
2.hdu4162
難在題意理解,就是為了便於記錄乙個圖形的旋轉等操作,將字串表示成差分形式,及s[i]=(s[i+1]-s[i]+8)%8,然後利用最小表示法找最小字典序即可
#include
#include
#include
using
namespace std;
string s;
int change[
610000];
int len;
intminimumrepresentation()
else
}return
min(i,j);}
intmain()
change[
2*len-1]
=change[len-1]
;int pos=
minimumrepresentation()
;for
(int i=
0;i)printf
("%d"
,change[i+pos]);
printf
("\n");
}return0;
}
最小表示法
最小表示法就是找出字串s的的迴圈同構串中字典序最小的乙個。那麼什麼是迴圈同構串呢。是 設s bcad 且s 是s 的迴圈同構的串。s 可以是 bcad 或者cadb,adbc,dbca 即在字串s中從i 0開始,從i迴圈到字串末尾,再從頭迴圈到i,所形成的字元就是s迴圈同構串。因為這樣的同構串不止乙...
最小表示法
最小表示法 思想 在字串迴圈同構問題中的應用 摘自周源的ppt 前言 最小表示法 比起動態規劃 貪心等思想,在當今競賽中似乎並不是很常見。但是在解決判斷 同構 一類問題中卻起著重要的作用。本文即將討論字串中的同構問題,如何巧妙地運用最小表示法來解題呢,讓我們繼續一起思考吧。到底什麼是迴圈同構的字串呢...
最小表示法
最小表示法與kmp演算法一樣都可以解決字串匹配問題,但效率更高,短,作用更大。最小表示法就是乙個字串的最小字典序。怎麼求乙個字串的最小字典序呢?首先將這個字串擴充套件一倍 建設存在d陣列裡 然後我們用三個指標i 0,j 1,k 0,來尋找最小字典序的開頭字母,為了優於kmp,我們要做到o n i表示...