题意:给你sa数组,就是每个排名的后缀开始下标,让你求有多少种满足要求的串,有那么一个原理,对于相邻排名的两个后缀,后缀i的首字母要不要大于i-1,的取决于,第二个字符的比较,如果i的第二个字符>i-1的,那么i的首字符必然要+1,每一个后缀只要比较第二个字符就好,因为别的都会遍历到,这个是
if(ra[sa[i]+1]>ra[sa[i+1]+1]) m++,如果m大于25,那么就是无解,
否则的话 就是有m个位置所要+1,对于26个字符,只能往上加25次,那么根据隔板法,又由于 25次往上加这样的次数不一定要用光,所以再用一个盒子来装剩下的,25-m就是有m次往上加的位置已经确定了,不用管。
C(25-m+n+1-1,n+1-1)= C(25-m+n,n) 但是会爆ll,用java大数即可

import java.math.BigInteger;
import java.util.Scanner;public class Main
{public static int N = 100010;public static int[] sa = new int[N];public static int[] ra = new int[N];public static void main(String[] args) {Scanner cin = new Scanner(System.in );int t = cin.nextInt();while(t-- != 0){int n = cin.nextInt();sa[0] = n+1;for(int i = 1; i <= n; ++i){sa[i] = cin.nextInt();ra[sa[i]] = i;}if(n == 1){System.out.println(26);continue;}int m = 0;for(int i = 1; i < n; ++i){if(ra[sa[i]+1] > ra[sa[i+1]+1]) ++m;}if(m > 25){System.out.println(0);continue;}int hh = 25-m;BigInteger h = BigInteger.valueOf(hh);BigInteger n1 = BigInteger.valueOf(n);BigInteger ans = BigInteger.ONE;for(BigInteger i = BigInteger.valueOf(n+1); i.compareTo(n1.add(h)) <= 0; i = i.add(BigInteger.ONE)){ans = ans.multiply(i);}for(BigInteger i = BigInteger.ONE; i.compareTo(h) <= 0; i = i.add(BigInteger.ONE)){ans = ans.divide(i);}System.out.println(ans);}}}

后缀数组+贪心+隔板法相关推荐

  1. POJ 3581 Sequence ——后缀数组 最小表示法

    [题目分析] 一见到题目,就有了一个显而易见obviously的想法.只需要每次找到倒过来最小的那一个字符串翻转就可以了. 然而事情并不是这样的,比如说505023这样一个字符串,如果翻转了成为320 ...

  2. BZOJ 4278: [ONTAK2015]Tasowanie 后缀数组 + 贪心 + 细节

    Description 给定两个数字串A和B,通过将A和B进行二路归并得到一个新的数字串T,请找到字典序最小的T. Input 第一行包含一个正整数n(1<=n<=200000),表示A串 ...

  3. bzoj 4278 Tasowanie 后缀数组+贪心

    题目大意 给定两个数字串A和B,通过将A和B进行二路归并得到一个新的数字串T,请找到字典序最小的T.\(len \leq 200000\) 题解 我们从归并排序的角度去想,每次把两者之一较小的取出来 ...

  4. 4002 构造数组(可重复组合数问题--隔板法)

    1. 问题描述: 现在需要构造一对数组 (a,b),要求: 数组 a 和数组 b 的长度都为 m: 两个数组中的元素的取值范围都是 [1,n]: ∀i∈[1,m],ai ≤ bi: 数组 a 中元素非 ...

  5. 后缀数组 倍增法详解

    算法思路 主要是基于基数排序,如果基数排序没弄懂代码就会很难理解: 首先从k=0开始,从后缀数组里面选取步长为2^k的后缀数组的前子串 然后进行基数排序 如果排序后所有的名次数组的值都不相同,那么排序 ...

  6. [BZOJ4310]跳蚤-后缀数组-二分答案

    跳蚤 Description 很久很久以前,森林里住着一群跳蚤.一天,跳蚤国王得到了一个神秘的字符串,它想进行研究.首先,他会把串分成不超过 k 个子串,然后对于每个子串 S,他会从S的所有子串中选择 ...

  7. 后缀数组 + Hash + 二分 or Hash + 二分 + 双指针 求 LCP ---- 2017icpc 青岛 J Suffix (假题!!)

    题目链接 题目大意: 就是给你n个串每个串取一个后缀,要求把串拼起来要求字典序最小!! sum_length_of_n≤5e5sum\_length\_of\_n\leq 5e5sum_length_ ...

  8. UVa719 Glass Bread(后缀数组解法)

    题意:给出一个字符串,求其最小表示法 注意:用两个串拼成一个字符串,求其后缀数组及height数组 求其最小表示法时,过滤方法为 1.后缀数组的位置不能大于原字符串长度 2.其位置对应的height值 ...

  9. 转一个后缀数组的简单总结:

    后缀数组就是将字符串所有后缀排序后的数组,设字符串为S,令后缀Suffix(i)表示S[i..len(S)].用两个数组记录所有后缀的排序结果: Rank[i]记录Suffix(i)排序后的序号,即S ...

最新文章

  1. Win2003用NAT实现ADSL共享与×××服务器
  2. ANSYS报错Accelerations are exceeding internal limit解决方法
  3. python教程课后答案-python从入门到实践课后习题第八章
  4. meta name=viewport content=width=device-width,minimum-scale=1.0,maximum-scale=1.0/
  5. 1874: 生活大爆炸版石头剪刀布
  6. 如何设计第三方账号登陆?
  7. java ==陷阱_Java小陷阱
  8. 一张图看尽 Linux 内核运行原理
  9. C语言线程实例(生产者和消费者),Java多线程:生产者与消费者(1)
  10. 2. 使用keras-神经网络来做线性回归问题
  11. 《Web漏洞防护》读书笔记——第10章,反序列化漏洞防护
  12. 小米商城php源码安装教程,搭建小米商城 框架div
  13. Beyond Compare 激活解决办法
  14. EXCEL-解决表格被锁定和分组的冲突
  15. java星号心形代码_用符号拼一个完整的大爱心 它起源于中国的甲骨文的心字
  16. 关系抽取调研-工业界
  17. 在线登录注册功能(android客户端+javaweb服务端+腾讯云服务器+腾讯云数据库)
  18. keytool命令整理
  19. oracle常用函数 (一)
  20. 区块链技术以太坊简介

热门文章

  1. Android - 吸顶效果 布局篇
  2. Angular4 自制华容道拼图(可以升级难度、关卡、更换图片)
  3. Matlab图形绘制(一)三维曲线
  4. MySQL数据库存储过程
  5. Fortran文件操作-open
  6. 2、软件的生命周期软件测试的工作流程
  7. PHP信息PHPINFO
  8. USB总线驱动及鼠标驱动实例
  9. OpenVINO部署Mask-RCNN实例分割网络
  10. java设计按月每天签到_java微信签到功能实现:java做的一个简易的微信签到系统的案例...