ZOJ 3883 Scan Code 模拟

这是一篇关于如何将扫描码(Scan Code)转换为字符串的博客。内容涉及编辑器开发,Edward在处理特殊键盘输入时发现接收到的是扫描码而非ASCII码。任务是根据扫描码生成对应的字符串,考虑到shift和caps lock的状态。输入是多个测试用例,每个用例包含一行十六进制的扫描码,不超过1000000个字符。输出是根据扫描码生成的字符串,每个测试用例结束后换行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


模拟,考虑shift 和 caps 的各种组合


Scan Code

Time Limit: 2 Seconds       Memory Limit: 65536 KB

Edward is writing an editor. After he wrote the function to get input from his special keyboard, he found that what he got is scan code, instead of ASCII code. He is very busy, so he gives you the easy task, translate the scan code to a string.

The scan code is very simple, when you press a key, the keyboard will send a make code of this key to computer (if you press the key for a long time, keyboard will send the make code to computer many times), and when you release a key, the keyboard will send a brake code of this key to computer. When computer received a make code, a character or function for the key will do on the editor (Caps Lock is off at the beginning) excepted the Caps Lock key (do the function when press the key).

Input

Input will consist of multiple test cases.

Each case has one line, the scan code received from keyboard in Hex (scan code table is at Hint section), the length is less than or equal to 1000000.

Input's validation is guaranteed.

Output

For each case, output the string on the editor and put a newline at the end.

Sample input
16F0161216F016F012
16F0161612F016F012
Sample output
1!
11

http://en.wikipedia.org/wiki/Scancode

Here is the scan code table:

Scan Code Table

Author:  LU, Yi
Source:  ZOJ Monthly, July 2015
Submit     Status


#include<cstdio>
#include<cstring>
#include<iostream>
#include<map>
#include<string>

using namespace std;

const int maxn=2001000;

char up[54][20]=
{
"~","!","@","#","$","%","^","&","*","(",")","_","+","Backspace",
"Tab","Q","W","E","R","T","Y","U","I","O","P","{","}","|",
"Caps","A","S","D","F","G","H","J","K","L",":","\"","Enter",
"LShift","Z","X","C","V","B","N","M","<",">","?","RShift","Space"
};

char down[54][20]=
{
"`","1","2","3","4","5","6","7","8","9","0","-","=","Backspace",
"Tab","q","w","e","r","t","y","u","i","o","p","[","]","\\",
"Caps","a","s","d","f","g","h","j","k","l",";","'","Enter",
"LShift","z","x","c","v","b","n","m",",",".","/","RShift","Space"
};

string Value[54]=
{
"0E","16","1E","26","23","2E","36","3D","3E","46","22","4E","55","66","0D","15","1D","24",
"2C","2D","35","3C","43","44","4D","54","5B","5D","58","1C","1B","25","2B","33","34","3B",
"42","4B","4C","52","5A","12","1A","45","29","2A","32","31","3A","41","49","4A","59","21"
};

map<string,int> msi;

void init()
{
    for(int i=0;i<54;i++) msi[Value[i]]=i;
}

int st,ed;
int shL,shR;
int cap;
char input[maxn];
char output[maxn];

int main()
{
    init();

/*
    string in;
    while(cin>>in)
    {
        int id=msi[in];
        cout<<id<<": "<<up[id]<<endl;
    }
*/

    while(scanf("%s",input)!=EOF)
    {
        int len=strlen(input);

        st=0,ed=0; shL=0; shR=0; cap=0;

        int cpp=0;

        string cmd;
        for(int i=0;i<len;i+=2)
        {
            cmd="";
            cmd+=input[i];
            cmd+=input[i+1];

            if(cmd[0]=='F'&&cmd[1]=='0')
            {
                i+=2;
                cmd="";
                cmd+=input[i];
                cmd+=input[i+1];

                int id=msi[cmd];
                string info=up[id];


                if(info=="LShift"||info=="RShift")
                {
                    //cout<<"info: "<<info<<endl;
                    if(info=="LShift") shL=0;
                    else if(info=="RShift") shR=0;
                }
                else if(info=="Caps")
                {
                    cpp=0;
                }
            }
            else
            {
                int id=msi[cmd];
                string info=up[id];

                //cout<<"info: "<<info<<endl;

                if(info=="Backspace")
                {
                    if(ed>st) ed--;
                }
                else if(info=="Enter")
                {
                    output[ed++]='\n';
                }
                else if(info=="Space")
                {
                    output[ed++]=' ';
                }
                else if(info=="Tab")
                {
                    output[ed++]='\t';
                }
                else if(info=="LShift"||info=="RShift")
                {
                    if(info=="LShift") shL++;
                    if(info=="RShift") shR++;
                }
                else if(info=="Caps")
                {

                    if(cpp==0) cap=cap^1;
                    cpp=1;
                }
                else
                {
                    if(down[id][0]<='z'&&down[id][0]>='a')
                    {
                        int sh=(shL!=0)||(shR!=0);
                        if((sh&&cap)||(sh==0&&cap==0))
                        {
                           output[ed++]=down[id][0];
                        }
                        else
                        {
                            output[ed++]=up[id][0];
                        }
                    }
                    else
                    {
                        int sh=(shL!=0)||(shR!=0);
                        if(sh==0)
                        {
                           output[ed++]=down[id][0];
                        }
                        else
                        {
                            output[ed++]=up[id][0];
                        }
                    }
                }
            }
        }
        output[ed]=0;
        cout<<output<<endl;
    }
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值