山东省第二届ACM大学生程序设计竞赛 Crack Mathmen

题意:

有一个解码规则:

字母或者数字的ASCII码,然后平方,%997,得出一个数字,如果这个数字不够三位数的话,在前面加上0凑够它,从而得到了一个数字。

现在我们要做的就是把他给出的一串数字解码,解出他的信息。

先把数字和字母对应的数字解出来,如果有相同的话,对号入座。

AC代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <map>
#define mod 997

using namespace std;

int t, n;
int a[1000001], cnt;
char str[1000010];

int solve(int a, int n)
{
    if(n == 0)
        return 1;
    int x = solve(a, n / 2);
    long long ans = (long long)x * x % mod;
    if(n % 2 == 1)
        ans = ans * a % mod;
    return (int)ans;
}

int main()
{
    map<int, char>m;
    map<int, int>flag;
    scanf("%d", &t);
    while(t--)
    {
        m.clear();
        flag.clear();
        cnt = 0;
        scanf("%d", &n);
        scanf("%s", str);
        int len = strlen(str);
        if(len % 3 != 0)
        {
            printf("No Solution\n");
            continue;
        }
        for(int i = 0; i < len ; i+=3)
        {
            int tmp = 0;
            tmp = tmp * 10 + str[i] - ‘0‘;
            tmp = tmp * 10 + str[i + 1] - ‘0‘;
            tmp = tmp * 10 + str[i + 2] - ‘0‘;
            a[cnt++] = tmp;
        }
        for(int i = 65; i <= 90; i++)
        {
            int tmp = solve(i, n);
            m[tmp] = (char)i;
            flag[tmp]++;
        }
        for(int i = 48; i <= 57; i++)
        {
            int tmp = solve(i, n);
            m[tmp] = (char)i;
            flag[tmp]++;
        }
        for(int i = 97; i <= 122; i++)
        {
            int tmp = solve(i, n);
            m[tmp] = (char)i;
            flag[tmp]++;
        }
        bool mark = 1;
        for(int i = 0; i < cnt; i++)
        {
            if(flag[a[i]] != 1)
            {
                mark = 0;
                break;
            }
            else
            {
                str[i] = m[a[i]];
            }
        }
        str[cnt] = ‘\0‘;
        if(!mark) printf("No Solution\n");
        else printf("%s\n", str);
    }
    return 0;
}

/**************************************
    Problem id    : SDUT OJ E
    User name    : xam140325乔璐
    Result        : Accepted
    Take Memory    : 2568K
    Take Time    : 40MS
    Submit Time    : 2016-05-02 16:41:19
**************************************/
时间: 05-01

山东省第二届ACM大学生程序设计竞赛 Crack Mathmen的相关文章

[2011山东省第二届ACM大学生程序设计竞赛]——Identifiers

Identifiers Time Limit: 1000MS Memory limit: 65536K 题目:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2163 题目描写叙述 Identifier is an important concept in the C programming language. Identifiers provide names for several language

山东省第二届ACM大学生程序设计竞赛 D

组合数: AC代码: #include <iostream> #include <cstdio> #include <cstring> using namespace std; int c[1010][1010]; int main() { int t, n, k; for(int i = 0; i < 1001; i++) c[i][0] = 1; for(int i = 1; i < 1001; i++) { for(int j = 1; j <

山东省第一届ACM大学生程序设计竞赛(原题) 回顾 4.18

Phone Number 题目链接:http://acm.sdut.edu.cn/sdutoj/showproblem.php?pid=2151&cid=1172 题意很简单:给出N行电话号码,寻找有没有一串是另一串的前缀,有的话输出No,当然两个一样的也是No 题解:没有前缀0,直接用二维数组存,大循环就行了,用strcmp比较相等.不会超时. Hello World!     题目链接:http://acm.sdut.edu.cn/sdutoj/showproblem.php?pid=215

sdut 2153 Clockwise (2010年山东省第一届ACM大学生程序设计竞赛)

题目大意: n个点,第i个点和第i+1个点可以构成向量,问最少删除多少个点可以让构成的向量顺时针旋转或者逆时针旋转. 分析: dp很好想,dp[j][i]表示以向量ji(第j个点到第i个点构成的向量)为终点的最大顺时针/逆时针向量数.状态转移方程为 dp[j][i] = max{dp[k][j]+1}. 问题个关键是如何判断2个向量是顺时针还是逆时针. 计算几何用的知识是求叉积和点积,叉积的作用是判断两个向量的左右(顺逆),点积的作用是判断两个向量的前后.举个例子,假设有2个向量v1,v2,‘*

2010年山东省第一届ACM大学生程序设计竞赛 Balloons (BFS)

题意 : 找联通块的个数,Saya定义两个相连是 |xa-xb| + |ya-yb| ≤ 1 ,但是Kudo定义的相连是 |xa-xb|≤1 并且 |ya-yb|≤1.输出按照两种方式数的联通块的各数.思路 : 按照第一种定义方式就只能是上下左右四个位置,而第二种则是周围那8个都是相连的. 1 #include <iostream> 2 #include <stdio.h> 3 #include <stdlib.h> 4 #include <queue> 5

sdut 2159 Ivan comes again!(2010年山东省第一届ACM大学生程序设计竞赛) 线段树+离散

先看看上一个题: 题目大意是: 矩阵中有N个被标记的元素,然后针对每一个被标记的元素e(x,y),你要在所有被标记的元素中找到一个元素E(X,Y),使得X>x并且Y>y,如果存在多个满足条件的元素,先比较X,选择X最小的那个,如果还是有很多满足条件的元素,再比较Y,选择Y最小的元素,如果不存在就输出两个-1: 分析: 直接暴力就行了 这个题目大意: 这个题是上个题的坚强版,每次会增加或减少一个点,仍然找到一个元素E(X,Y),使得X>x并且Y>y: 最多有200000次操作,每次只

【总结】2018年山东省第九届ACM大学生程序设计竞赛

省赛刚结束,还是来总结一下吧 总的来说,这场省赛的表示实在是不能令人满意啊,自己还是太弱了呀. 首先,在开场之前,我们先看了一下十道题的题目,然后通过题目含义大概猜测了一下每道题的难度,并根据这个分配了一下读题(刚看到G.Game下意识认为是博弈论) 开题我和大佬负责读A因为感觉A题可做,五分钟后,按例刷一下榜看有人做出了C题,我们就分出一个人读C,我接着读A. 另外两个队友讨论了一下情况,就一人主打一人看代码,C题顺利AC. 然后我和他们讲了一下A题题意,自己还是菜呀,当时只想到了一种暴力的解

[简单思维题]Sequence(山东省第九届ACM大学生程序设计竞赛E题)

Problem Description We define an element a_iai? in a sequence "good", if and only if there exists a j(1\le j < i)j(1≤j<i) such that a_j < a_iaj?<ai?.Given a permutation pp of integers from 11 to nn. Remove an element from the permuta

[2012山东省第三届ACM大学生程序设计竞赛]——Fruit Ninja II

Fruit Ninja II 题目:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2416 Time Limit: 5000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描述 Have you ever played a popular game named "Fruit Ninja"? Fruit Ninja (known as Fruit Ninja