列表

详情


NC202024. 密码系统

描述

相对于传统技工,现代科技的密码锁往往更加安全可靠。
在 X 国的密码系统中,初始由小写字母组成的长度为 的密码环上划分为 段长度为  的密码子串,最后甄选出字典序最大的子串作为备选密码。例如 的密码环 baca 可以划分为 ba 与 ca 或者 ac 和 ab,在这两种划分方案中备选密码分别是 ca 和 ac。
现在请你在所有可能的备选密码中找出字典序最小的密码!

输入描述

第一行输入两个正整数 ,保证 
接下来一行输入长度为 的小写字符串,描述密码环的内容。

输出描述

输出一行字符串,表示字典序最小的备选密码。

示例1

输入:

4 2
baca

输出:

ac

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 82ms, 内存消耗: 7672K, 提交时间: 2020-04-17 21:58:37

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
int n,k,r[N],p[N],q[N];
char c[N];
bool cmp(int x,int y){
	for(int i=0;i<k;i+=min(r[x+i]-x-i,r[y+i]-y-i)){
		if(c[x+i]!=c[y+i])return c[x+i]<c[y+i];
	}
	return 0;
}
int main(){
	scanf("%d %d %s",&n,&k,c+1);
	for(int i=1;i<=n;++i)c[i+n]=c[i];
	for(int i=n+n;i;i--){
		if(c[i]!=c[i+1])r[i]=i+1;
		else r[i]=r[i+1];
	}
	int l=n/k;
	for(int i=1;i<=k;++i){
		for(int o=1;o<=l;++o){
			p[o]=k*(o-1)+i;
		}
		sort(p+1,p+l+1,cmp);
		q[i]=p[l];
	}
	int z=1;
	for(int i=2;i<=k;++i){
		if(!cmp(q[z],q[i]))z=i;
	}
	for(int i=0;i<k;++i)putchar(c[q[z]+i]);
	return 0;
}

C++11(clang++ 3.9) 解法, 执行用时: 90ms, 内存消耗: 16636K, 提交时间: 2020-04-17 19:48:35

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define inc(i, l, r) for (int i = l; i <= r; i++)

const int maxn = 1e6 + 5;

string s;
int n, k;
string res = "~";

int main() {
    cin >> n >> k >> s;
    s.append(s.substr(0, n / k));
    vector<string> v(k, string(n / k, '0'));
    inc(del, 0, n / k - 1) {
        string tmp = "";
        inc(i, 0, k - 1) tmp = max(tmp, s.substr(n / k * i + del, n / k));
       // cout << tmp << "\n";
        res = min(res, tmp);
    }
    cout << res << "\n";
}

上一题