最小迴圈表示(hdu4162)
阿新 • • 發佈:2019-02-12
思路:最小迴圈表示(有一個字串,這個字串的首尾是連在一起的,要求尋找一個位置,以該位置為起點的字串的字典序在所有的字串中中最小。最小迴圈表示可以方便的計算出兩個迴圈字串是否相等。兩個字串相等,當且僅當它們的最小迴圈表示相等。)模板題
#include <cstdio> #include <cstdlib> #include <cstring> #include <bitset> #include <cmath> #include <cctype> #include <iostream> #include <algorithm> #include <string> #include <vector> #include <queue> #include <map> #include <set> #include <sstream> #include <iomanip> using namespace std; typedef long long ll; typedef unsigned long long ull; const ll inff = 0x3f3f3f3f3f3f3f3f; #define FOR(i,a,b) for(int i(a);i<=(b);++i) #define FOL(i,a,b) for(int i(a);i>=(b);--i) #define REW(a,b) memset(a,b,sizeof(a)) #define inf int(0x3f3f3f3f) #define si(a) scanf("%d",&a) #define sl(a) scanf("%I64d",&a) #define sd(a) scanf("%lf",&a) #define ss(a) scanf("%s",a) #define mod int(1e9+7) #define pb push_back #define lc (d<<1) #define Pll pair<ll,ll> #define P pair<int,int> #define pi acos(-1) string b,a,c; int as() { int i=0,j=1,k=0,l=a.size(); l/=2; while(i<l&&j<l&&k<l) { if(a[i+k]==a[j+k]) k++; else { if(a[i+k]<a[j+k]) j+=k+1; else i+=k+1; k=0; if(i==j) j++; } } return min(i,j); } int main() { cin.tie(0); cout.tie(0); while(cin>>b) { a.clear(); int x; a+=(b[0]-b[b.size()-1]+8)%8+'0'; for(int i=1;i<b.size();i++) a+=(b[i]-b[i-1]+8)%8+'0'; c=a; a+=a; x=as(); for(int i=x;i<c.size();i++) cout<<c[i]; FOR(i,0,x-1) cout<<c[i]; cout<<endl; } return 0; }