牛客練習賽36 A Rabbit的字符串(字符串最小表示法)
阿新 • • 發佈:2019-01-09
terminal 一次 har color .com tor mes abc 長度
鏈接:https://ac.nowcoder.com/acm/contest/328/A
來源:牛客網
題目描述
Rabbit得到了一個字符串,她的好朋友xxx可以給這個字符串施加一次魔法。 魔法可以選擇字符串的任一位置,並將該位置後面的所有字符水平拼接到串首。 例如:對於字符串abcde,可以通過施加魔法得到cdeab。 如果xxx通過施加魔法將字符串的字典序變得嚴格比之前的小,那麽他將拿走這一字符串。 Rabbit想知道自己的字符串會不會被xxx拿走。輸入描述:
第一行一個整數n,表示字符串的長度。
接下來一行一個長度為n的只由小寫字母組成的字符串。
輸出描述:
如果Rabbit的字符串會被xxx拿走,輸出“YES”。示例1
否則輸出“NO”。
(不輸出引號)
輸入
復制5 cdeab
輸出
復制YES
說明
xxx可以把e之後的部分“ab”放到串首,得到abcde,字典序比cdeab小,故將拿走字符串。示例2
輸入
復制5 abcde
輸出
復制NO
備註:
1≤n≤100000標答: 可以用字符串最小表示法解決。
字典序的說明:https://en.wikipedia.org/wiki/Alphabetical_order
#include <cstdio> #includeView Code<bits/stdc++.h> #include <map> #include <cstring> #include <algorithm> using namespace std; #define mst(a,b) memset((a),(b),sizeof(a)) #define rush() int T;scanf("%d",&T);while(T--) typedef long long ll; const int maxn = 100005; const ll INF = 1e18; const ll mod=1e9+7; const doubleeps = 1e-9; char s[maxn]; char tmp[maxn]; int find_min(char *s,int len) { int i=0,j=1,k=0,t; while(i<len&&j<len&&k<len) { t=s[(i+k)>=len?i+k-len:i+k]-s[(j+k)>=len?j+k-len:j+k]; if(t==0)k++; else { if(t>0) i+=k+1; else j+=k+1; if(i==j) ++j; k=0; } } return (i<j?i:j); } void get_temp(int len) { int k=find_min(s,len); for(int i=0; i<len; i++) { tmp[i]=s[(i+k)%len]; } } int main() { int n; scanf("%d",&n); scanf("%s",s); get_temp(n); tmp[n]=‘\0‘; if(strcmp(s,tmp)==0) puts("NO"); else puts("YES"); }
不會證明。攢個模板吧。
int find_min(char *s,int len) { int i=0,j=1,k=0,t; while(i<len&&j<len&&k<len) { t=s[(i+k)>=len?i+k-len:i+k]-s[(j+k)>=len?j+k-len:j+k]; if(t==0)k++; else { if(t>0) i+=k+1; else j+=k+1; if(i==j) ++j; k=0; } } return (i<j?i:j); }View Code
牛客練習賽36 A Rabbit的字符串(字符串最小表示法)