1. 程式人生 > >牛客練習賽36 A Rabbit的字符串(字符串最小表示法)

牛客練習賽36 A Rabbit的字符串(字符串最小表示法)

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”。
否則輸出“NO”。
(不輸出引號)
示例1

輸入

復制
5
cdeab

輸出

復制
YES

說明

xxx可以把e之後的部分“ab”放到串首,得到abcde,字典序比cdeab小,故將拿走字符串。
示例2

輸入

復制
5
abcde

輸出

復制
NO

備註:

1≤n≤100000

字典序的說明:https://en.wikipedia.org/wiki/Alphabetical_order
標答: 可以用字符串最小表示法解決。 技術分享圖片
#include <cstdio>
#include 
<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 double
eps = 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"); }
View Code

不會證明。攢個模板吧。

技術分享圖片
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的字符串(字符串最小表示法)