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).
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.
http://en.wikipedia.org/wiki/Scancode
Here is the scan code table:
![](http://acm.zju.edu.cn/onlinejudge/showImage.do?name=scancode.png)
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;
}
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:
![](http://acm.zju.edu.cn/onlinejudge/showImage.do?name=scancode.png)
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;
}
相关文章推荐
- 托福作文——《十天突破新托福Essay》
- c# winform 使DataGridView的一些总结
- Antenna Placement(POJ--3020
- zjnu(1182)——能量项链
- Easyui-Datagrid—表头灵活显示
- [LeedCode OJ]#137 Single Number II
- Can you solve this equation?--二分
- Introduction to Java Programming编程题9.4<求某个字符的出现次数>
- 回调函数
- JFreeChart的基本使用
- Linux格式化硬盘 常用命令小记
- 2015/8/24/checkBox/imageView/ArrayAdapter/SimpleAdapter/自定义Adapter
- 我的潜意识
- python 模块学习--Numpy
- HDU 1695 GCD(容斥定理)
- 集线,路由和交换的概念
- 迷茫
- SQL函数
- C++实现String
- Android第四讲——常用的基本控件(一)TextView、EditText、Button、RadioButton、CheckButton、ImageView