ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

2019 牛客多校赛 第七场 String 最小表示法

2019-08-14 09:38:49  阅读:220  来源: 互联网

标签:拆成 String int 第七场 最小 牛客 while str string


2019 牛客多校赛 第七场 String 最小表示法

最开始看到这题的时候,从题目里给的样例就认为是把原串拆成n个最长的非递减序列,后来发现并不是这样,因为题目所要求的是将其拆分为最少的部分,并且所有部分都是满足在不同表示顺序中具有最小的字典序,和我的想法有那么些不同。

举个栗子:对于01101111这个串,按题目要求拆开所得的串就只有01101111,而按我自己的理解,就会拆成011和01111;这是两个的不同之处。

所以就只能按最大长度的最小表示法的方法做,上代码:

#include <bits/stdc++.h>
using namespace std;
const int maxn=2001;
int t;
string str;
bool judge(string s){
    int i=0,j=1,k=0,ll=s.length();
    while (i<ll && j<ll && k<ll)
    {
        int com=s[(i+k)%ll]-s[(j+k)%ll];
        if(com==0)//两位相等的情况
            k++;
        else {
            if(com>0)//起点为i的轮回字符串比较大的时候
                i+=(k+1);
            else
                j+=(k+1);//起点为j的轮回字符串比较大的时候
            if(i==j)
                j++;//避免相等的情况
            k=0;
        }
    }
    if(min(i,j)==0)
        return 1;
    else
        return 0;
}//检测是否为最小表示
int main()
{
    scanf("%d",&t);
    while (t--)
    {
        cin>>str;
       int len=str.length();
       int l=0;
       while(1){
            for(int i=len;i>=0;i--){//枚举的i-l的长度,从大的开始枚举,因为要拆成最少部分
                string s=str.substr(l,i-l);//取子串的方式,前面时初始位置,后面时所取长度
                if(judge(s)){
                    cout<<s;
                    l=i;
                    break;
                }
            }
            if(l!=len)
                cout<<' ';
            else
                break;
       }
        cout<<endl;
    }
    return 0;
}

标签:拆成,String,int,第七场,最小,牛客,while,str,string
来源: https://blog.csdn.net/qq_33437973/article/details/99541798

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有