2014 UESTC 暑前集训队内赛(2) 部分解题报告

B.Cuckoo for Hashing

模拟题。

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <string>
#include <vector>
using namespace std;
#define N 50007

int a[1004],b[1004];

int main()
{
    int n1,n2,m,i;
    int x,fx,tx;
    int tmp,tmp2;
    int cs = 1;
    while(scanf("%d%d%d",&n1,&n2,&m)!=EOF && (n1||n2||m))
    {
        memset(a,-1,sizeof(a));
        memset(b,-1,sizeof(b));
        while(m--)
        {
            scanf("%d",&x);
            fx = x%n1;
            tx = 1003;
            if(a[fx] == -1)
            {
                a[fx] = x;
                continue;
            }
            tmp2 = x;
            while(a[fx] != -1)
            {
                tmp = a[fx];
                a[fx] = tmp2;
                tx = tmp%n2;
                if(b[tx] != -1)
                {
                    tmp2 = b[tx];
                    b[tx] = tmp;
                    fx = tmp2%n1;
                }
                else
                {
                    b[tx] = tmp;
                    break;
                }
            }
            if(a[fx] == -1)
                a[fx] = tmp2;
        }
        printf("Case %d:
",cs++);
        int flag = 0;
        //printf("Table 1
");
        for(i=0;i<n1;i++)
        {
            if(a[i] != -1)
            {
                flag = 1;
                break;
            }
        }
        if(flag)
        {
            printf("Table 1
");
            for(i=0;i<n1;i++)
            {
                if(a[i] != -1)
                    printf("%d:%d
",i,a[i]);
            }
        }
        flag = 0;
        for(i=0;i<n2;i++)
        {
            if(b[i] != -1)
            {
                flag = 1;
                break;
            }
        }
        if(flag)
        {
            printf("Table 2
");
            for(i=0;i<n2;i++)
            {
                if(b[i] != -1)
                    printf("%d:%d
",i,b[i]);
            }
        }
    }
    return 0;
}
View Code

C.Playing Fair with Cryptography

模拟题,注意细节就好。遇到J的情况要及时跳走。

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <string>
using namespace std;
#define N 50007

char mp[7][7];
char key[100003],text[100004];
int vis[28];

string RUN(string ss)
{
    int i,j;
    int a,b;
    int c,d;
    string ans = "";
    for(i=0;i<5;i++)
    {
        for(j=0;j<5;j++)
        {
            if(mp[i][j] == ss[0])
                a = i,b = j;
            if(mp[i][j] == ss[1])
                c = i,d = j;
        }
    }
    if(a == c)
    {
        int newb = (b+1)%5;
        ans += mp[a][newb];
        int newd = (d+1)%5;
        ans += mp[a][newd];
        return ans;
    }
    else if(b == d)
    {
        int newa = (a+1)%5;
        ans += mp[newa][b];
        int newc = (c+1)%5;
        ans += mp[newc][b];
        return ans;
    }
    else
    {
        int newb = d;
        int newd = b;
        ans += mp[a][newb];
        ans += mp[c][newd];
        return ans;
    }
}

int main()
{
    int t,i,cs = 1,j,k;
    int x,y;
    scanf("%d",&t);
    getchar();
    while(t--)
    {
        gets(key);
        gets(text);
        int len1 = strlen(text);
        int len2 = strlen(key);
        memset(vis,0,sizeof(vis));
        k = 0;
        for(i=0;i<len2;i++)
        {
            char ch = key[i];
            if((ch >= 'A' && ch <= 'Z'))
            {
                if(vis[ch-'A'])
                    continue;
                vis[ch-'A'] = 1;
                mp[k/5][k%5] = ch;
                k++;
            }
            else if(ch >= 'a' && ch <= 'z')
            {
                ch -= 32;
                if(vis[ch-'A'])
                    continue;
                vis[ch-'A'] = 1;
                mp[k/5][k%5] = ch;
                k++;
            }
        }
        for(char chh = 'A';chh<='Z';chh++)
        {
            if(chh == 'J')
                continue;
            if(!vis[chh-'A'])
            {
                mp[k/5][k%5] = chh;
                k++;
            }
        }
        //alpha table established
        char ss[100004];
        k = 0;
        for(i=0;i<len1;i++)
        {
            if(text[i] >= 'A' && text[i] <='Z')
                ss[k++] = text[i];
            else if(text[i] >= 'a' && text[i] <= 'z')
                ss[k++] = text[i]-32;
        }
        ss[k] = '