比赛 |
NOIP2015普及组练习 |
评测结果 |
AAAAAAAAAA |
题目名称 |
Vigenère密码 |
最终得分 |
100 |
用户昵称 |
lxtgogogo |
运行时间 |
0.015 s |
代码语言 |
C++ |
内存使用 |
0.33 MiB |
提交时间 |
2015-11-03 21:42:37 |
显示代码纯文本
#include<iostream>
#include<string>
#include<cstdio>
using namespace std;
string str;
string key;
int n=0,m=0,nk[100]={};
struct hehe
{
int zifu;
bool big;
};
hehe mi[1000],ming[1000];
void exchange()
{
for(int i=0;i<1000;i++) //默认都不是大写
{
mi[i].big=false;
ming[i].big=false;
}
n=str.size(); //将密文换成全相应数字并记录大写的位置
for(int i=0;i<n;i++)
{
if(int(str[i])>96)
mi[i].zifu=int(str[i])-96;
else
{
mi[i].zifu=int(str[i])-64;
mi[i].big=true;
}
}
m=key.size();
for(int i=0;i<m;i++)//密匙全转相应数字
{
if(int(key[i])>96)
nk[i]=int(key[i])-96;
else nk[i]=int(key[i])-64;
}
}
void work()
{
int k=0;
for(int i=0;i<n;i++)
{
if((mi[i].zifu+1-nk[k])<=0) //转换
ming[i].zifu=mi[i].zifu+1-nk[k]+26;
else ming[i].zifu=mi[i].zifu+1-nk[k];
k++;
if(k+1>m) k=0;
}
}
void print()
{
for(int i=0;i<n;i++)
{
if(mi[i].big==true)
cout<<char(ming[i].zifu+64);
else cout<<char(ming[i].zifu+96);
}
}
int main()
{
freopen("vigenere.in","r",stdin);
freopen("vigenere.out","w",stdout);
cin>>key>>str;
exchange();
work();
print();
cout<<endl;
fclose(stdin);fclose(stdout);
return 0;
}