直接模拟
密钥对应的小写字母的在26个字母中的序号(从0开始)即为密文字母转换成明文向左移的位数
举个例子: ‘b’左移一位变成‘A’
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1005;
char s[N],k[N],ans[N];
int a[N];
int main(){
// freopen("vigenere.in","r",stdin);
// freopen("vigenere.out","w",stdout);
scanf("%s",k);
scanf("%s",s);
int len1=strlen(k);
int len2=strlen(s);
for(int i=0;i<min(len1,len2);i++)
{
if(k[i]>='a'&&k[i]<='z')a[i]=k[i]-'a';
else if(k[i]>='A'&&k[i]<='Z')a[i]=k[i]-'A';
}
if(len2>len1)
{
for(int i=len1;i<len2;i++)
{
a[i]=a[i-len1];
}
}
for(int i=0;i<len2;i++)
{
ans[i]=s[i]-a[i];
if(s[i]>='a'&&s[i]<='z'&&ans[i]<'a')ans[i]+=26;
else if(s[i]>='A'&&s[i]<='Z'&&ans[i]<'A')ans[i]+=26;
cout<<ans[i];
}
return 0;
}