-
B - Ugly Number
- Gym - 101875B
- 初始时,让i=0,j=1,k=0,其中i,j,k表示的是以i开头和以j开头的字符串的前k个字符相同
- 分为三种情况
- 1.如果str[i+k]==str[j+k] k++。
- 2.如果str[i+k] > str[j+k] i = i + k + 1,即最小表示不可能以str[i->i+k]开头。
- 3.如果str[i+k] < str[j+k] j = j + k + 1,即最小表示不可能以str[j->j+k]开头。
- 那么只要循环n次,就能够判断出字符串的最小表示是以哪个字符开头。
- 为什么当str[i+k] > str[j+k] i = i + k + 1,最小表示不可能以str[i->i+k]开头
- 因为以i或j——>i或j+k之间的为新的起点肯定不如以当前的minn+k开始的小
-
#include<bits/stdc++.h> using namespace std; int n,ans; string str,son; int getmin() { int i=0,j=1,k=0; while(i<n&&j<n&&k<n) { int t=str[(i+k)%n]-str[(j+k)%n]; if(t==0) k++; else { if(t>0) i+=k+1; else j+=k+1; if(i==j) j++; k=0; } } return min(i,j); } int main() { cin>>n>>str; int ans=getmin(); for(int i=ans; i<ans+n; i++) son+=str[i%n]; for(int i=0; i<n; i++) if(son[i]<str[i]) { cout<<"No"<<endl; return 0; } cout<<"Yes"<<endl; return 0; }
B - Ugly Number -最小表示法
最新推荐文章于 2020-09-10 17:57:13 发布