Canada Cup 2016 C. Hidden Word

题解:

构造题...当时想到了怎么做了。。

无奈码力太弱,一个位置写错了 fst

具体思路是。只要相同的字母不是相邻的,就一定可以构造

具体构造方法是把相同的字母的这一段放在最右边

xxxxxxxxx-----

xxxxxxxxxx----

如上图所示,然后X处就转圈画了..

代码:

#include<bits/stdc++.h>
using namespace std;
#define pb push_back
#define mp make_pair
#define se second
#define fs first
#define LL long long
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
typedef pair<int,int> P;
const double eps=1e-9;
const int maxn=200100;
const int mod=1e9+7;
const int INF=1e9;

vector<int> v[30];
string s;
int a[30];

int main()
{
    cin>>s;
    for(int i=0;i<27;i++) v[s[i]-‘A‘].pb(i);
    int flag=0,pos,pre;
    for(int i=0;i<27;i++)
    {
        if(v[i].size()<=1) continue;
        for(int j=1;j<v[i].size();j++)
        {
            if(v[i][j]-v[i][j-1]!=1)
            {
                flag=1;
                pre=v[i][j-1];
                pos=v[i][j];
                break;
            }
        }
    }
    if(!flag) cout<<"Impossible"<<endl;
    else
    {
        int k=pos-pre;
        if(k%2)
        {
            k/=2;
            k++;
            for(int i=13-k+1;i<=13;i++) a[i]=pre++;
            k--;
            for(int i=26;i>=26-k+1;i--) a[i]=pre++;
            int j=26-k;
            for(j=26-k;j>=14;j--)
            {
                ++pos;
                if(pos>26) break;
                a[j]=pos;
            }
            if(pos>26)
            {
                int m=0;
                if(j>=14)
                {
                    while(j>=14) a[j--]=m++;
                }
                j=1;
                while(j<13-k) a[j++]=m++;
            }
            else if(j<14)
            {
                j=1;
                pos++;
                while(pos<=26) a[j++]=pos++;
                int m=0;
                while(j<13-k) a[j++]=m++;
            }
        }
        else
        {
            k/=2;
            for(int i=13-k+1;i<=13;i++) a[i]=pre++;
            for(int i=26;i>=26-k+1;i--) a[i]=pre++;
            int j=26-k;
            for(j=26-k;j>=14;j--)
            {
                ++pos;
                if(pos>26) break;
                a[j]=pos;
            }
            if(pos>26)
            {
                int m=0;
                if(j>=14)
                {
                    while(j>=14) a[j--]=m++;
                }
                j=1;
                while(j<=13-k) a[j++]=m++;
            }
            else if(j<14)
            {
                j=1;
                pos++;
                while(pos<=26) a[j++]=pos++;
                int m=0;
                while(j<=13-k) a[j++]=m++;
            }
        }
        for(int i=1;i<=13;i++) cout<<s[a[i]];
        cout<<endl;
        for(int i=14;i<=26;i++) cout<<s[a[i]];
        cout<<endl;
    }
    return 0;
}
时间: 2024-12-26 00:44:32

Canada Cup 2016 C. Hidden Word的相关文章

codeforces 8VC Venture Cup 2016 - Elimination Round C. Lieges of Legendre

C. Lieges of Legendre 题意:给n,m表示有n个为2的倍数,m个为3的倍数:问这n+m个数不重复时的最大值 最小为多少? 数据:(0 ≤ n, m ≤ 1 000 000, n + m > 0) ps:很水的题,主要是策略: 思路:由于里面每隔6就会重复一次,不好直接模拟,并且模拟的效率很低,那就二分吧!二分即上界为2单独的最大倍数与3单独时的最大倍数之和,下界为前面二者的max;之后利用判断是否mid/2 >= n && mid/3 >= m &am

8VC Venture Cup 2016 - Elimination Round

在家补补题   模拟 A - Robot Sequence #include <bits/stdc++.h> char str[202]; void move(int &x, int &y, char ch) { if (ch == 'U') x--; if (ch == 'D') x++; if (ch == 'L') y--; if (ch == 'R') y++; } int main(void) { int n; scanf ("%d", &

Codeforces Canda Cup 2016

A.B:模拟 C.构造下就行了 D.题意:n个参加ACM的队(n<=300000),每个队都有自己的初始气球数和重量,规定如果气球数>重量,那么此队就会飞起来,淘汰出局,你现在是第一组,你可以给其他组气球,问你最高能排名多少,你的排名是气球数严格大于你气球数的队伍数+1.  分析:贪心的想法,将那些气球数大于你的队伍放在优先队列里维护wi-ti的最小值,优先淘汰wi-ti小的队伍,给他气球的同时,你也会气球减少,也就可能有其他你后面的队伍比你高,这些队要新加入优先队列.  具体的操作是将所有队

Codeforces#348DIV2/VK CUP 2016

昨天第一次开大小号打cf,发现原来小号提交之后大号在此提交同样的代码会被skipped掉,然后之后提交的代码都不记分,昨天a,b,c都是水题 A 题意:问一个物品最多能被分成多少份,分成的连续两份不能相同 分析:直接1,2这样份,所以除以3乘2,在对3取模 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <string> 5 #include <vect

8VC Venture Cup 2016 - Final Round (Div2) E

贪心.当前位置满油可达的gas station中,如果有比它小的,则加油至第一个比他小的.没有,则加满油,先到达这些station中最小的.注意数的范围即可. #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #define LL long long using namespace std; const int MAXN = 200050; int d,

Codeforces Round #351 (VK Cup 2016 Round 3, Div. 2 Edition) B

#include<stdio.h> #include<algorithm> #include<vector> #include<string.h> using namespace std; int main() { int n,m,i; while(scanf("%d%d",&n,&m)!=EOF) { vector<int> da,xi; int a,b; int maxa=1,minb=n; for(i=1

Codeforces Round #348 (VK Cup 2016 Round 2, Div. 1 Edition) C. Little Artem and Random Variable 数学

C. Little Artem and Random Variable Little Artyom decided to study probability theory. He found a book with a lot of nice exercises and now wants you to help him with one of them. Consider two dices. When thrown each dice shows some integer from 1 to

8VC Venture Cup 2016 - Elimination Round E. Simple Skewness(枚举+三分)

题目链接:点击打开链接 题意:给你n个数, 要求选若干个数, 使得这些数的平均数减去中位数尽量大. 思路:由于该题没有顺序问题, 排好序之后我们可以枚举中位数, 可以证明, 奇数个数一定比偶数优,然后三分中位数左右区间长度x(数的个数), 在中位数的右边选最大的x个数, 在左边也选最大的x个, 这样, 随着区间长度的增加, 平均数将先增大后减小, 或者一直减小,或者一直增大. 为什么呢? 假设第一次的区间长度是1, 那么我们选择了两边最大的两个数, 假设他们加起来取平均大于中位数, 那么对答案有

Codeforces 8VC Venture Cup 2016 - Elimination Round F. Group Projects 差分DP*****

F. Group Projects There are n students in a class working on group projects. The students will divide into groups (some students may be in groups alone), work on their independent pieces, and then discuss the results together. It takes the i-th stude