码迷,mamicode.com
首页 > 编程语言 > 详细

Codeforces Gym 100286J Javanese Cryptoanalysis 傻逼暴力

时间:2015-08-08 22:36:14      阅读:139      评论:0      收藏:0      [点我收藏+]

标签:

原题地址:http://codeforces.com/gym/100286/attachments/download/2013/20082009-acmicpc-northeastern-european-regional-contest-neerc-08-en.pdf

此题题意是给你一个单对单密文,让你还原为原文,原文有个性质是,每个单词都是元音和辅音交替组成。

做法是直接5重for,暴力枚举AEIOU分别对应的字母,然后检查,然后输出

详见代码:

//#include<iostream>
#include<fstream>
#include<vector>
#include<string>
#include <string.h>

#define MAX_A 26
#define MAX_N 100005
using namespace std;

vector<int> G[MAX_A];

string str[MAX_N];
int n = 0;
string s;

bool g[MAX_A][MAX_A];

int vo[MAX_A];
int tot = 0;
bool flag = 1;

int main() {
    ifstream cin("javanese.in");
    ofstream cout("javanese.out");
    cin.sync_with_stdio(false);
    for (int i = 0; i < 26; i++) {
        if (i != 0 && i != E - A && i != I - A && i != O - A && i != U - A)
            vo[tot++] = i;
    }
    while (cin >> s) {
        if (s == "*")break;
        str[n++] = s;
        for (int i = 0; i + 1 < s.length(); i++) {
            int u = s[i] - A, v = s[i + 1] - A;
            if (u == v)flag = false;
            if (g[u][v])continue;
            G[s[i] - A].push_back(s[i + 1] - A);
            g[u][v] = 1;
        }
        if (flag == 0) {
            cout << "impossible" << endl;
            return 0;
        }
    }
    int a[5];

    for (a[0] = 0; a[0] < 26; a[0]++)
        for (a[1] = a[0] + 1; a[1] < 26; a[1]++)
            for (a[2] = a[1] + 1; a[2] < 26; a[2]++)
                for (a[3] = a[2] + 1; a[3] < 26; a[3]++)
                    for (a[4] = a[3] + 1; a[4] < 26; a[4]++) {
                        int f[26];
                        memset(f, -1, sizeof(f));
                        int tmp = 0;
                        bool t = 1;
                        for (int i = 0; i < 5 && t; i++)
                            for (int j = 0; j < 5 && t; j++)if (g[a[i]][a[j]])t = 0;
                        if (t == 0)continue;
                        for (int i = 0; i < 26; i++)
                            for (int j = 0; j < 26; j++)
                                if (g[i][j] && i != a[0] && i != a[1] && i != a[2] && i != a[3] && i != a[4] &&
                                    j != a[0] && j != a[1] && j != a[2] && j != a[3] && j != a[4])
                                    t = 0;
                        if (t == 0)continue;
                        for (int i = 0; i < n; i++, cout << " ")
                            for (int j = 0; j < str[i].length(); j++) {
                                int u = str[i][j] - A;
                                if (f[u] != -1) {
                                    cout << (char)(f[u] + A);
                                    continue;
                                }
                                if (u == a[0])f[u] = A - A;
                                else if (u == a[1])f[u] = E - A;
                                else if (u == a[2])f[u] = I - A;
                                else if (u == a[3])f[u] = O - A;
                                else if (u == a[4])f[u] = U - A;
                                else f[u] = vo[tmp++];
                                cout << (char)(f[u] + A);
                            }
                        cout << endl;
                        return 0;
                    }
    cout << "impossible" << endl;
    return 0;
}

 

Codeforces Gym 100286J Javanese Cryptoanalysis 傻逼暴力

标签:

原文地址:http://www.cnblogs.com/HarryGuo2012/p/4713998.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!