B - Ugly Number Gym - 101875B
A k-cyclic shift of an integer x is a function that removes the last k digits of x and inserts them in its beginning. For example, the k-cyclic shifts of 123 are 312 for k = 1 and 231 for k = 2.
Teo, a kid from Canada, learned from his Canadian friends this definition of ugly numbers: a number is ugly if, and only if every one of its k-cyclic shifts returns a number greater than or equal to it.
Given an n-digit decimal number x, can you answer if it is ugly or not?
Input
The first line of the input contains a single integer n (1 ≤ n ≤ 5 × 105), indicating the number of digits of the number.
The next line contains an n-digit decimal number, indicating the value of x.
Output
Output “Yes” if x is an ugly number and “No” otherwise.
Examples
Input
3
123
Output
Yes
Input
4
2214
Output
No
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<map>
#include<string>
using namespace std;
int getmin(char *a,int n)
{
int i=0,j=1,k=0;
int t;
//从i开始k长度和从j开始k长度的字符串作比较
while(i<n&&j<n&&k<n)
{
t=a[(i+k)%n]-a[(j+k)%n];
//t用来计算相应位置上那个字符字典序哪个大
if(!t) //相等就下一个
{
k++;
}
else
{
if(t>0){i+=k+1;}
//i位置大,最大表示法j+=k+1
else{j+=k+1;}
//j位置大,最大表示法i+=k+1
if(i==j){j++;}
k=0;
}
}
if(i<j){return i;}
else {return j;}
}
int main()
{
int n;
char a[500005];
scanf("%d",&n);
scanf("%s",a);
int k=getmin(a,n);
if(k==0)
{
printf("Yes\n");
}
else
{
printf("No\n");
}
return 0;
}