zoukankan      html  css  js  c++  java
  • 山东省第二届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
    ");
                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] = '';
            if(!mark) printf("No Solution
    ");
            else printf("%s
    ", 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  
    **************************************/
  • 相关阅读:
    ORACLE SEQUENCE 介绍
    cocos2d 游戏开发:Cocos2d v3 &quot;hello world&quot;+显示飞船
    无线网络覆盖
    解决xShell4某些情况下按删除键会输出^H的问题
    Android开发经验之—intent传递大数据
    简单的REST的框架实现
    ListView 使用方法(Asp.Net)
    POJ2528 Mayor&#39;s posters 【线段树】+【成段更新】+【离散化】
    C#反射Assembly 具体说明
    HDU 4432 Sum of divisors (进制模拟)
  • 原文地址:https://www.cnblogs.com/qioalu/p/5453097.html
Copyright © 2011-2022 走看看