2176: Strange string

Time Limit: 10 Sec  Memory Limit: 259 MB
Submit: 419  Solved: 174
[Submit][Status][Discuss]

Description

给定一个字符串S = {S1, S2, S3 … Sn}, 如果在串SS中, 子串T(|T| = n)为所有长度为n的SS的字串中最小的(字符串的比较), 则称T为”奇怪的字串”. 你的任务就是找出这个字符串.

Input

读入两行, 第一行为n, 第二行为字符串S.

Output

将”奇怪的字串” T输出输入样例

Sample Input

10
asdfasdfas

Sample Output

asasdfasdf

HINT

数据范围

对于100%的数据, 保证n≤10000000;

给定的字符串中的字符保证在#33 ~ #254之间.

题解:最小表示法。

  1. #pragma GCC optimize(2)
  2. #pragma G++ optimize(2)
  3. #include<iostream>
  4. #include<algorithm>
  5. #include<cmath>
  6. #include<cstdio>
  7. #include<cstring>
  8.  
  9. #define N 10000007
  10. using namespace std;
  11. inline int read()
  12. {
  13. int x=,f=;char ch=getchar();
  14. while(!isdigit(ch)){if(ch=='-')f=-;ch=getchar();}
  15. while(isdigit(ch)){x=(x<<)+(x<<)+ch-'';ch=getchar();}
  16. return x*f;
  17. }
  18.  
  19. int n;
  20. unsigned char a[N*];
  21.  
  22. int solve()
  23. {
  24. int i=,j=;
  25. while(i<=n&&j<=n)
  26. {
  27. int k=;while(a[i+k]==a[j+k]&&k<=n-)k++;
  28. if(k==n)break;
  29. else if (a[i+k]<a[j+k])j=max(i+,j+k+);
  30. else i=max(j+,i+k+);
  31. }
  32. return min(i,j);
  33. }
  34. int main()
  35. {
  36. n=read();
  37. scanf("%s",a+);
  38. for (int i=;i<=n;i++)
  39. a[i+n]=a[i];
  40. int st=solve();
  41. for (int i=st;i<=st+n-;i++)
  42. putchar(a[i]);
  43. }

bzoj 2176 最小表示的更多相关文章

  1. BZOJ 2458 最小三角形 | 平面分治

    BZOJ 2458 最小三角形 题面 一个平面上有很多点,求他们中的点组成的周长最小的三角形的周长. 题解 跟平面最近点对差不多,也是先把区间内的点按x坐标从中间分开,递归处理,然后再处理横跨中线的三 ...

  2. BZOJ 2176 Strange String (最小表示法)

    题目大意: 与别的裸题的唯一不同点是其符号的ASCII码值在3 ~ 254 之间. 算法讨论: 最小表示法直接上.但是唯一不同的就是注意这里的字符范围,用char是会get wa的,所以要用unsig ...

  3. BZOJ 2176 Strange string 最小表示法

    题目大意:给定一个串S,求最小表示法 n<=1000W,实在不敢写后缀自己主动机,就去学了最小表示法= = 记得用unsigned char不然WA= = 数据真是逗- - #include & ...

  4. BZOJ 2176 Strange string ——最小表示法

    本来想用来练习后缀自动机的,但是100w有点虚(事实证明确实T掉了). 只好上最小表示法. #include <cstdio> #include <cstring> #incl ...

  5. BZOJ 1412 & 最小割

    什么时候ZJ省选再现一次这么良心的题吧... 题意: 在一个染色的格子画分割线,使其不想连,求最少的线段 SOL: 裸裸的最小割.题目要求两种颜色不想连,我们把他分到两个集合,也就是把所有相连的边切断 ...

  6. BZOJ 1797 最小割

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1797 题意:给出一个有向图,每条边有流量,给出源点汇点s.t.对于每条边,询问:(1)是 ...

  7. BZOJ 2229 最小割

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2229 题意:给定一个带权无向图.若干询问,每个询问回答有多少点对(s,t)满足s和t的最 ...

  8. bzoj 1497 最小割模型

    我们可以对于消费和盈利的点建立二分图,开始答案为所有的盈利和, 那么源向消费的点连边,流量为消费值,盈利向汇连边,流量为盈利值 中间盈利对应的消费连边,流量为INF,那么我们求这张图的最小割,用 开始 ...

  9. bzoj 2150 最小路径覆盖

    最小路径覆盖问题是:给定一个DAG,该DAG的一个路径覆盖是一个路径的集合,使得每个点属于且仅属于其中一条路径,问题就是求一个大小最小的路径集合. 做法是将每个点A拆成两个点A1,A2,如果A-> ...

随机推荐

  1. Oracle创建、管理撤销表空间

    撤销管理模式: 用户通过设定撤销管理模式(undo mode)就可以灵活地选择使用手动撤销管理(manual undo management)或自动撤销管理(automatic undo manage ...

  2. Azure Powershell使用已有特殊化非托管磁盘创建ARM虚拟机

    生成已有特殊化非托管磁盘的方法主要有如下两种: 1.使用StorageExplorer存储管理工具,复制特殊化磁盘到一个新的容器下 2.New Portal中删除虚拟机,默认vhd文件会保留在存储账号 ...

  3. Django 类方式view进行进行用户验证

    问题: Django中,view的书写方式有两种,一种是def函数方式,一种是class方式,函数方式通过@login_required装饰器标记函数,就必须通过用户验证,而类,则没办法通过此方法进行 ...

  4. java1.8--Optional类

    身为一名Java程序员,大家可能都有这样的经历:调用一个方法得到了返回值却不能直接将返回值作为参数去调用别的方法.我们首先要判断这个返回值是否为null,只有在非空的前提下才能将其作为其他方法的参数. ...

  5. 一张表搞清楚php is_null、empty、isset的区别

    isset 判断变量是否已存在 empty 判断变量是否为空或为0 is_null 判断变量是否为NULL 变量 empty is_null isset $a="" true fa ...

  6. HashiCorp Vault介绍

    HashiCorp Vault是一款企业级私密信息管理工具.说起Vault,不得不提它的创造者HashiCorp公司.HashiCorp是一家专注于DevOps工具链的公司,其旗下明星级产品包括Vag ...

  7. Hibernate (三)

    1 一对多的单向 示例:一个已经存在的学生,新建一个班级,然后将该学生加入到该班级之下 设置inverse="false" <?xml version="1.0&q ...

  8. 【转】CString,string,char*综合比较

    (一)  概述 1.string和CString均是字符串模a板类: 2.string为标准模板类(STL)定义的字符串类,已经纳入C++标准之中: 3.CString(typedef CString ...

  9. 使用jdbc存储图片和大文本

    package cn.itcast.i_batch; import java.sql.Connection; import java.sql.PreparedStatement; import jav ...

  10. How to create and start VirtualBox VM without GUI

    Suppose you want to create and run virtual machines (VMs) on VirtualBox. However, a host machine doe ...