二分$T$​​​​​​​​和$S$​​​​​​​​第一个不同的位置,即需要对于$s$​​​​​​​​,判定是否存在$T[1,s]=S[1,s]$​​​​​​​​且满足条件的$T$​​​​

(注:这里的条件不包含$T$的字典序最小)

显然$T[1,s]$​​已经确定,记其中第$i$​​种字母出现次数为$a_{i}$​​

而对于$T(s,n]$​,只有字典序(尽量大)和字符数量的限制,因此若交换两个字符能增大字典序显然不劣,重复交换这样的字符,不难得到最终字符从前往后是不上升的

设其中第$i$​​种字符有$b_{i}$​​个,即希望依次最大化$b_{26},b_{25},...,b_{1}$​​​​,不妨依次暴力枚举(共$\sigma(k)$​​​种取值),并对后面的部分背包+bitset判定是否可行,即可得到该序列并进而比较与$S$的字典序

这一部分的复杂度为$o(\alpha\sigma(k)\frac{n}{\omega}\log n)$​​(其中$\alpha=26$​​,$\omega=64$​​)

进一步的,由于下一个位置一定不同,那么再之后的部分也仅有字典序(尽量小)和字符数量的限制,可以类似地求出,而下一个位置直接暴力枚举即可

这一部分的复杂度为$o(\alpha^{2}\sigma(k)\frac{n}{\omega})$

综上,(单组数据)复杂度为$o(\alpha\sigma(k)\frac{n}{\omega}\log n+\alpha^{2}\sigma(k)\frac{n}{\omega})$,可以通过​

 1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 100005
4 #define A 26
5 vector<int>v;
6 bitset<N>bt[A+1];
7 int t,n,m,a[A],b[A];
8 char s[N];
9 bool get_max(int n){
10 memset(b,0,sizeof(b));
11 for(int i=A-1;i>=0;i--){
12 bt[i].reset();
13 for(int j=0;(j<v.size())&&(a[i]<=v[j]);j++){
14 int x=v[j]-a[i];
15 if (x<=n)bt[i]|=(bt[i+1]<<x);
16 }
17 }
18 if (!bt[0][n])return 0;
19 for(int i=0;i<A;i++)
20 for(int j=0;(j<v.size())&&(a[i]<=v[j]);j++){
21 b[i]=v[j]-a[i];
22 if ((b[i]<=n)&&(bt[i+1][n-b[i]])){
23 n-=b[i];
24 break;
25 }
26 }
27 return 1;
28 }
29 bool check(int k){
30 memset(a,0,sizeof(a));
31 for(int i=1;i<=k;i++)a['z'-s[i]]++;
32 if (!get_max(n-k))return 0;
33 for(int i=0;i<A;i++)
34 for(int j=0;j<b[i];j++)
35 if (s[++k]!='z'-i)return s[k]<'z'-i;
36 return 1;
37 }
38 int main(){
39 bt[A][0]=1;
40 scanf("%d",&t);
41 while (t--){
42 scanf("%d%d%s",&n,&m,s+1);
43 v.clear();
44 for(int i=m;i;i--)
45 if (m%i==0)v.push_back(i);
46 v.push_back(0);
47 memset(a,0,sizeof(a));
48 if (!check(0)){
49 printf("-1\n");
50 continue;
51 }
52 int l=0,r=n;
53 while (l<r){
54 int mid=(l+r+1>>1);
55 if (check(mid))l=mid;
56 else r=mid-1;
57 }
58 if (l==n){
59 printf("%s\n",s+1);
60 continue;
61 }
62 memset(a,0,sizeof(a));
63 for(int i=1;i<=l;i++)a[s[i]-'a']++;
64 for(int i=s[l+1]-'a'+1;i<A;i++){
65 a[i]++;
66 if (get_max(n-l-1)){
67 for(int j=1;j<=l;j++)printf("%c",s[j]);
68 printf("%c",i+'a');
69 for(int j=0;j<A;j++)
70 while (b[j]--)printf("%c",j+'a');
71 printf("\n");
72 break;
73 }
74 a[i]--;
75 }
76 }
77 return 0;
78 }

[hdu7044]Fall with Fake Problem的更多相关文章

  1. IOS UITableView分组与索引分区实例

    #import <UIKit/UIKit.h> @interface AppDelegate : UIResponder <UIApplicationDelegate> @pr ...

  2. Problem of saving images in WPF (RenderTargetBitmap)zz

      To save a visual to an image file need to use RenderTargetBitmap, detail is reference to Save and ...

  3. fake gucci outlet perform a couple associated with things in great trust

    Based on my a lot of years of encounter within Taobao, purchase bags must go to the high reputation ...

  4. Google Code Jam 2010 Round 1A Problem A. Rotate

    https://code.google.com/codejam/contest/544101/dashboard#s=p0     Problem In the exciting game of Jo ...

  5. Bag Problem

    Bag Problem Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/131072 K (Java/Others) Total ...

  6. Codeforces Round #310 (Div. 2) B. Case of Fake Numbers 水题

    B. Case of Fake Numbers Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/5 ...

  7. HDU 5924 Mr. Frog’s Problem 【模拟】 (2016CCPC东北地区大学生程序设计竞赛)

    Mr. Frog's Problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Other ...

  8. C#学习日志 day10 -------------- problem statement

    Revision History Date Issue Description Author 15/May/2015 1.0 Finish most of the designed function. ...

  9. 2013-2014 ACM-ICPC, NEERC, Southern Subregional Contest Problem D. Grumpy Cat 交互题

    Problem D. Grumpy Cat 题目连接: http://www.codeforces.com/gym/100253 Description This problem is a littl ...

随机推荐

  1. PTA数据结构 习题2.8 输出全排列 (20分)

    习题2.8 输出全排列 (20分) 请编写程序输出前n个正整数的全排列(n<10),并通过9个测试用例(即n从1到9)观察n逐步增大时程序的运行时间. 输入格式: 输入给出正整数n(<10 ...

  2. Framework - 性能统计

    摘要 近期对接客户时,客户方希望提供 SDK 的性能.内存.隐私支持等一些数据,所以就对 SDK 进行了一些性能测试. 在用表格统计整理这些数据时,突然发现,经常用统计的方式看 SDK 的相关数据,似 ...

  3. [no code][scrum meeting] Beta 3

    $( "#cnblogs_post_body" ).catalog() 例会时间:5月15日11:30,主持者:肖思炀 下次例会时间:5月16日11:30,主持者:伦泽标 一.工作 ...

  4. 2021.9.28考试总结[NOIP模拟64]

    T1 三元组 发现确定\(b,c\)的情况下,\(a\)的值域是连续的.确定\(b\)后\(a+b\)的取值是\([1+b,b+b]\).树状数组维护对每个\(b\)可行的\(c\). 注意取模后取值 ...

  5. 图像原始格式(YUV444 YUV422 YUV420)一探究竟

    前段时间搞x264编码测试,传参的时候需要告诉编码器我的原始数据格式是什么,其中在x264.h头文件中定义了如下一堆类型. /* Colorspace type */ #define X264_CSP ...

  6. linux下使用shell命令通过wpa_cli控制wpa_supplicant连接wifi

    最近在调试wifi,已经把wpa_supplicant 工具编译打包好了,为了测试wif驱动及wifi模块是否ok,需要用shell命令临时启动wifi服务连接wifi热点测试. 首先板子启动用ifc ...

  7. linux下文件后面带~

    之前发现有时候在命令行ls会看到一些文件后面带有-,而这些文件的名字和我们文件夹中的某些文件是一模一样的文件,在文件夹中没发现就很大胆地删掉了也没是,一直没管,觉得是什么临时复制的文件或者隐藏文件.今 ...

  8. linux 内核修炼之道——系统调用

    1.问:什么是系统调用? 用户应用程序访问并使用内核所提供的各种服务的途径即是系统调用,也称系统调用接口层. 2.问:为什么需要系统调用? ① 系统调用作为内核和应用程序之间的中间层,扮演了一个桥梁角 ...

  9. flex步局 11.02

    语法 justify-content: flex-start | flex-end | center | space-between | space-around flex-start:弹性盒子元素将 ...

  10. 测试平台系列(72) 了解ApScheduler基本用法

    大家好~我是米洛! 我正在从0到1打造一个开源的接口测试平台, 也在编写一套与之对应的完整教程,希望大家多多支持. 欢迎关注我的公众号测试开发坑货,获取最新文章教程! 回顾 上一节我们调研了一下市面上 ...