列表

详情


NC200578. 奇怪的回文子串

描述

小凯想构造长度为len的字符串。但是这个字符串需要满足以下要求

1. 构造的字符串中最长的那一个回文子串,它的长度L满足
2. 给定n种字母,其出现次数不大于a_i
3. 都是小写字母

如果无法构造输出-1,否则输出你所构造的字符串。

回文串的定义:“回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。

回文子串的定义为:字符串中连续若干个字符,其为回文串。

输入描述

首先输入样例组数 

接下来对于每组样例输入四个数

接下来n行每行输入一个小写字母c_i,一个数字,代表字符c_i最多出现a_i

输出描述

对于每个样例输出你构造好的字符串,如果无法完成构造输出-1。

示例1

输入:

2
0 4 2 0
2 5 3 2
a 3
b 2

输出:

aaaa
aaabb

原站题解

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

Python3(3.5.2) 解法, 执行用时: 238ms, 内存消耗: 5432K, 提交时间: 2020-07-31 15:01:03

# 君指先跃动の光は、私の一生不変の信仰に、唯私の超电磁炮永生き!
from sys import stdin, stdout
import math
from itertools import permutations
import random


def soulution():
    t = int(input().strip())
    for _ in range(t):
        arr = [9999] * 26
        n, l, x, y = map(int, input().strip().split())
        for i in range(n):
            ch, cn = map(lambda ele: ele.strip(), input().split())
            arr[ord(ch) - ord('a')] = int(cn)
        pend = []
        for i in range(26):
            if arr[i] == 9999:
                pend.append(chr(ord('a') + i))
        s = pend[0] * (x - 1)
        cur = 0
        while len(s) != l:
            s += pend[cur]
            cur = (cur + 1) % len(pend)
        print(s)

soulution()

C++14(g++5.4) 解法, 执行用时: 46ms, 内存消耗: 1508K, 提交时间: 2019-12-28 21:35:55

#include<iostream>
using namespace std;
int a[30];
int main() {
	int t;
	cin >> t;
	while (t--) {
		for (int i = 0; i < 30; i++) a[i] = -1;
		int n, len, x, y;
		cin >> n >> len >> x >> y;
		while (n--) {
			char c;
			int cl;
			cin >> c >> cl;
			a[c - 'a'] = cl;
		}
		char k[4];
		int num = 0;
		for (int i = 0; i < 26; i++) {
			if (a[i] == -1) k[num++] = i + 'a';
			if (num >= 4) break;
		}
		for (int i = 0; i < x; i++) cout << k[0];
		for (int i = 0; i < len - x; i++) {
			cout << k[i % 3 + 1];
		}
		cout << endl;
	}
}

C++11(clang++ 3.9) 解法, 执行用时: 6ms, 内存消耗: 1272K, 提交时间: 2020-07-16 11:57:18

#include<bits/stdc++.h>
using namespace std;

int main()
{
    int i,n,len,x,y,t,L,V[26];
    char c,T[26],ans[1005];
    scanf("%d",&t);
    while(t--)
    {
    	memset(V,-1,sizeof(V)),L=0;
    	scanf("%d%d%d%d",&n,&len,&x,&y);
    	while(n--)scanf(" %c%d",&c,&i),V[c-'a']=i;
    	for(i=0;i<26;i++)if(V[i]==-1)T[L++]=i+'a';
    	for(i=0;i<x;i++)ans[i]=T[0];
    	for(;i<len;i++)ans[i]=T[i%3+1];
    	ans[len]='\0',printf("%s\n",ans);
	}
}

上一题