您的位置:首页 > 其它

ZOJ 3883 Scan Code 模拟

2015-08-24 20:32 295 查看
模拟,考虑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:



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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: