Codeforces Round #630 (Div. 2)(A~E)

B. Composite Coloring

题目链接

题意:

让你为n个数染色,要让相同颜色的两个数的gcd > 1 , 问怎么染, 题目保证可以让使用的颜色不大于11种。

思路:

偶数 :染颜色1
奇数 ; 染他的最小质因子的指定色
#include <bits/stdc++.h>
using namespace std;
const int maxn =  2e3 + 10;
#define ll long long
#define ios std::ios::sync_with_stdio(false)
#define int long long
typedef unsigned long long ULL;
int a[maxn];
int ans[maxn];
vector<int> su;
map<int ,int>ma;
signed main()
{
    ios;
    cin.tie(0);///
    su.clear();
    su.push_back(2);///存1 ~ 1000以内的素数
    for(int i = 3 ; i < 1000 ; i += 2){
        bool ok = true;
        for(int j = 2 ; j < i - 1 ; j ++){
            if(i % j == 0){
                ok = false ;
                break;
            }
        }
        if(ok)su.push_back(i);
    }
    int t;
    cin >> t;
    while(t --){
        ma.clear();
        int n;
        cin >> n;
        for(int i = 1 ; i <= n ; i ++){
            cin >> a[i];
            ans[i] = 0;
        }
        int cnt = 1;
 
        for(int i = 1 ; i <= n ; i ++){
 
            for(int j = 0 ; j < su.size() ; j ++){
                if(a[i] % su[j] == 0){
                    if(ma[su[j]] == 0)ma[su[j]] = cnt , cnt ++;///map存该素数对应颜色
                    ans[i] = ma[su[j]];
                    break;
                }
            }
        }
        for(int i = 1 ; i <= n ; i ++){
            if(ans[i] == 0){
                ans[i] = cnt , cnt ++;
            }
        }
        cout << cnt - 1 << '\n';
        for(int i = 1 ; i <= n ; i ++){
            cout << ans[i] << ' ';
        }
        cout << '\n';
 
    }
    return 0;
}
View Code

C. K-Complete Word

题目链接

题意:

给你个字符串,你可以操作让其中一个字符变为任意一个字符,问你要最少进行多少次操作才能让这个字符串变成一个周期为k的,且在一个周期内为回文的字符串。
即使S(1 ~ k) = S(k + 1 ~ k + k)=...... 且子串S(1 ~k) 是回文。

思路:

遍历字符串,算每个字符的贡献。
如:查看s(1) , s(k + 1) , s(2 * k + 1) ....哪个字符出现次数最多,就用这个字符,作整个字符串转变后的第一位的字符。
#include <bits/stdc++.h>
using namespace std;
const int maxn =  2e5 + 10;
#define ll long long
#define ios std::ios::sync_with_stdio(false)
#define int long long
char ch[maxn];
int cnt[maxn][30];
char ans[maxn];
signed main()
{
    ios;
    cin.tie(0);///
    int t;
    cin >> t;
    while(t --){
    int n , k;
    cin >> n >> k;
    cin >> ch + 1;
    for(int i = 0 ; i <= n ; i ++){
        for(int j = 0 ; j < 30 ; j ++){
            cnt[i][j] = 0;///初始化
        }
    }
    for(int i = 1 ; i <= n ; i += k){
        for(int j = i ; j < i + k ; j ++){
            cnt[j - i + 1][ch[j] - 'a'] ++;
        }
    }
    for(int i = 1 ; i <= (k + 1) / 2 ; i ++){
        int maxx = -1 , pos = -1;
        for(int j = 0 ; j < 30 ; j ++){
            cnt[i][j] += cnt[k - i + 1][j];///对折了一下,因为是回文
            if(maxx < cnt[i][j]){
                maxx = cnt[i][j];
                pos = j;
            }
        }
        ans[i] = ('a' + pos);
    }
    for(int i = 1 ; i <= (k + 1) / 2 ; i ++){
        ans[k - i + 1] = ans[i];
    }
    int c = 0;
    for(int i = 1 ; i <= n ; i += k){
        for(int j = i ; j < i + k ; j ++){
            if(ans[j - i + 1] != ch[j])c ++;
        }
    }
 
    cout << c << '\n';
    }
    return 0;
}
View Code

 

posted @ 2020-04-02 19:04  GoodVv  阅读(174)  评论(0编辑  收藏  举报