传送门:https://ac.nowcoder.com/acm/contest/887/A

题意:大意就是给你一个只含有0和1的字符串,找出一种分割方法,使得每个分割出的字符串都是在该字符串自循环节中最小

思路:

一:

最小表示法的模板题了,数据范围比较小。每次枚举字符串的最长长度,用最小表示法进行判断即可。

最小表示法的介绍:https://oi-wiki.org/string/minimal-string/

代码:

#include<bits/stdc++.h>
using namespace std;
char s[205];
char t[205];
//最小表示法进行判断
bool solve(int l, int r)
{
int len = 0;
for(int i = l; i <= r; i++)
t[len++] = s[i];
int i = 0, j = 1, k = 0;
while(i < len && j < len && k < len)
{
int num = t[(i + k) % len] - t[(j + k) % len];
if(!num)
k++;
else
{
if(num > 0)
{
i += k + 1;
}
else
{
j += k + 1;
}
if(i == j)
j++;
k = 0;
}
}
if(min(i, j) == 0)
return true;
else
return false;
}
void print(int l, int r)
{
for(int i = l; i <= r; i++)
cout << s[i];
cout << " ";
}
int main()
{
int T;
scanf("%d", &T);
getchar();
while(T--)
{
scanf("%s", s);
int n = strlen(s);
for(int i = 0; i < n; )
{
for(int j = n - 1; j >= i; j--)//每次从后面枚举,即是使得长度尽可能的长
{
if(i == j || solve(i, j))
{
print(i, j);
i = j + 1;
}
}
}
cout << endl;
}
}

  

 

二:

看的别人的写法。

首先看一下数据范围,题目中的保证每个01字符串的长度都不会超过200,所以可以去暴力枚举,在枚举的时候要注意,由于需要保证分割次数最少,所以每个字符串要尽可能的长,所以枚举时就要从最长的开始,找好起点之后,首次枚举都从起点到字符串末尾,然后慢慢缩小范围,然后找到合适的范围后(即该字符串时自循环中的最小值)再更新起点即可,直至枚举完整个字符串。重点说一下,如何判断枚举出的字符串是不是自循环字符串中的最小值。
   我们知道,对于一串数来说,无论什么进制,最高位数字或权值越大的位上(越靠前的位上)的数字越大,那么这串数字本身就越大,比如199和201,201最高位数字为2,大于199最高位数字1,所以201>199,(果两个数字位数不同,就前边补0,补成相同的,再比如2020和2019,在前两位相同的情况下,第三位数字2>1,所以2020>2019。就用这个思路来判断该字符串是不是自循环字符串中最小值。
   对于自循环来说,我们还可以认为,自循环就是依次让每个数字都做一次最高位,所以对于长度为len的字符串,自循环就有len中方式,也就产生了len个数字,所以我们利用当前字符串的每一位去和自循环产生的字符串的每一位去作比较,如何当前字符串与自循环产生的字符串的相同位上,当前字符串大,那么直接否决,如果小,直接让当前字符串去和下一个自循环字符串去比较(从高位开始比,高位小,总体一定小)

代码:

#include<bits/stdc++.h>
using namespace std;
bool check(string str){
int len=str.length();
for(int i=0;i<len;i++){
for(int j=0;j<len;j++){
if(str[j]>str[(i+j)%len])
return false;
if(str[j]<str[(i+j)%len])
break;
}
}
return true;
}
int main(){
int n;
cin>>n;
while(n--){
string t;
cin>>t;
int len=t.length();
int head=0;
while(head<len){
for(int j=len-head;j>0;j--){
if(check(t.substr(head,j))){
cout<<t.substr(head,j);
head+=j;
if(head<len)
cout<<" ";
break;
}
}
}
cout<<endl;
}
return 0;
}

  

 

2019牛客暑期多校训练营(第七场)A.String【最小表示法】的更多相关文章

  1. 2019牛客暑期多校训练营(第九场)A:Power of Fibonacci(斐波拉契幂次和)

    题意:求Σfi^m%p. zoj上p是1e9+7,牛客是1e9:  对于这两个,分别有不同的做法. 前者利用公式,公式里面有sqrt(5),我们只需要二次剩余求即可.     后者mod=1e9,5才 ...

  2. 2019牛客暑期多校训练营(第一场)A题【单调栈】(补题)

    链接:https://ac.nowcoder.com/acm/contest/881/A来源:牛客网 题目描述 Two arrays u and v each with m distinct elem ...

  3. 2019牛客暑期多校训练营(第一场) B Integration (数学)

    链接:https://ac.nowcoder.com/acm/contest/881/B 来源:牛客网 Integration 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 5242 ...

  4. 2019牛客暑期多校训练营(第一场) A Equivalent Prefixes ( st 表 + 二分+分治)

    链接:https://ac.nowcoder.com/acm/contest/881/A 来源:牛客网 Equivalent Prefixes 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/ ...

  5. 2019牛客暑期多校训练营(第二场)F.Partition problem

    链接:https://ac.nowcoder.com/acm/contest/882/F来源:牛客网 Given 2N people, you need to assign each of them ...

  6. 2019牛客暑期多校训练营(第一场)A Equivalent Prefixes(单调栈/二分+分治)

    链接:https://ac.nowcoder.com/acm/contest/881/A来源:牛客网 Two arrays u and v each with m distinct elements ...

  7. [状态压缩,折半搜索] 2019牛客暑期多校训练营(第九场)Knapsack Cryptosystem

    链接:https://ac.nowcoder.com/acm/contest/889/D来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 262144K,其他语言52428 ...

  8. 2019牛客暑期多校训练营(第二场)J-Subarray(思维)

    >传送门< 前言 这题我前前后后看了三遍,每次都是把网上相关的博客和通过代码认真看了再思考,然并卵,最后终于第三遍也就是现在终于看懂了,其实懂了之后发现其实没有那么难,但是的的确确需要思维 ...

  9. 2019牛客暑期多校训练营(第一场)-A (单调栈)

    题目链接:https://ac.nowcoder.com/acm/contest/881/A 题意:给定两个长度均为n的数组a和b,求最大的p使得(a1,ap)和(b1,bp)等价,等价的定义为其任意 ...

  10. 2019牛客暑期多校训练营(第一场)A - Equivalent Prefixes(单调栈)

    题意 给定两个$n$个元素的数组$a,b$,它们的前$p$个元素构成的数组是"等价"的,求$p$的最大值."等价"的意思是在其任意一个子区间内的最小值相同. $ ...

随机推荐

  1. http请求的过程及潜在的性能优化点

    web前端的看富于部署过程 开发者将开发的代码发布到远程的服务器(webserver/cdn),用户通过访问浏览器输入相应的网址,浏览器向远程服务器发送请求,动态的增量式的加载资源 web前端就是一个 ...

  2. matlab和fortran混合编程

    matlab2016b+vs2010+ivf2013+f90 其实默认是f77语法,但通过配置可以改变为自由格式. 默认只能f77代码,怎样修改: https://ww2.mathworks.cn/m ...

  3. 061-PHP函数定义默认参数

    <?php function add($x=2,$y=3){ //定义函数并设置默认参数 return $x+$y; } echo add(); //不传入参数调用add函数add(2,3) e ...

  4. WinForm读写App.config配置文件

    一.配置文件概述: 应用程序配置文件是标准的 XML 文件,XML 标记和属性是区分大小写的.它是可以按需要更改的,开发人员可以使用配置文件来更改设置,而不必重编译应用程序.配置文件的根节点是conf ...

  5. 第七篇 Django-认证系统

    Django-认证系统 阅读目录(Content) 1 Cookie 与 Session 概念 查看cookie 登陆应用 Django中操作Cookie 1.获取Cookie 2.设置Cookie ...

  6. 使用node.js安装asar和反编译app.asar

    背景:app.asar文件是Electron加密打包时的中间产物,electron.exe调用resources文件夹下的app.asar从而实现不用解压缩而直接读取文件内容的高效. 一.需要先安装n ...

  7. 原子类型字段更新器AtomicXxxxFieldUpdater

    本博客系列是学习并发编程过程中的记录总结.由于文章比较多,写的时间也比较散,所以我整理了个目录贴(传送门),方便查阅. 并发编程系列博客传送门 原子类型字段更新器 在java.util.concurr ...

  8. 小明有5本新书,要借给A、B、C三位小朋友 若每人每次只能借一本,则可以有多少种不同的借法?

    /* 问题描述: 小明有5本新书,要借给A.B.C三位小朋友, 若每人每次只能借一本,则可以有多少种不同的借法? 问题分析: 本题属于数学当中最常见的排列组合问题, 即求从5个数当中取3个不同数的排列 ...

  9. UVALive 5913 字典树

    先输入n个字符串的字典,每个字符串的前缀+后缀可以组成新的合法字符串,但肯定是有重复的,问从给定的字符串,生成的所有可能的字符串为多少个 把前缀和后缀压入字典树,达到前缀和后缀的去重,首先的总和即为前 ...

  10. URAL_1018 Binary Apple Tree 树形DP+背包

    这个题目给定一棵树,以及树的每个树枝的苹果数量,要求在保留K个树枝的情况下最多能保留多少个苹果 一看就觉得是个树形DP,然后想出 dp[i][j]来表示第i个节点保留j个树枝的最大苹果数,但是在树形过 ...