Codeforces Beta Round #92 (Div. 1 Only) A. Prime Permutation

原题地址:http://codeforces.com/problemset/problem/123/A
题目大意:一个字符串(下标从1开始),设其总长为L,问能否改变字符的顺序,使得所有不超过L的质数p,满足 s [ p ] = s [ p k ] p k <= L
分析:注意到2是质数(关键),因此对于所有偶数下标所对应的字符一定相同。再有对于下标为p的字符,若p*2

#include <bits/stdc++.h>
#include <cmath>
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
#include <vector>
#include <stack>
#include <set>
#include <cctype>
#define eps 1e-8
#define INF 0x3f3f3f3f
#define MOD 1e9+7
#define PI acos(-1)
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define CLR(x,y) memset((x),y,sizeof(x))
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn = 1e3 + 5;
int prime[maxn] = {0}, num_prime = 0;
int isNotPrime[maxn] = {1, 1};
void judge() {
    for (int i = 2 ; i < maxn ; i ++) {
        if (! isNotPrime[i])
            prime[num_prime ++] = i;
        for (int j = 0 ; j < num_prime && i * prime[j] <  maxn; j ++) {
            isNotPrime[i * prime[j]] = 1;
            if ( !(i % prime[j] ) )  break;
        }
    }
}
char ch;
int a[maxn];//
char str[maxn];
map<char, int>mp;
int main() {
    judge();
    char s[maxn];
    scanf("%s", s + 1);
    int len = strlen(s + 1);
    int MAX = 0;
    for(int i = 1; i <= len; i++) {//找最大的数量的字母
        mp[s[i]]++;
        if(mp[s[i]] > MAX) {
            MAX = mp[s[i]];
            ch = s[i];
        }
    }

    int num = 0;
    num += len / 2;
    for(int i = 2; i <= len; i += 2) a[i] = 1;
    for(int i = 1; i < num_prime; i++) {//按照题目要求的最大的需求
        if(prime[i] * 2 > len) break;
        for(int j = prime[i]; j <= len; j += 2 * prime[i])  if(!a[j]) {
                num++;
                a[j] = 1;
            }
    }

    vector<char>v;
    v.clear();
    for(int i = 1; i <= len; i++) {//存没关系的字母
        if(s[i] != ch) v.push_back(s[i]);
    }

    if(num > MAX) {
        printf("NO\n");
    } else {
        printf("YES\n");
        int pos = 0;
        for(int i = 1; i <= len; i++) {
            if(a[i]) str[i] = ch;
            else if(pos < v.size()) {
                str[i] = v[pos++];
            } else str[i] = ch;
        }
        str[len + 1] = 0;
        printf("%s", str + 1);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/yiqzq/article/details/81490124
今日推荐