写了一遍感觉其实就是栅栏加密的升级版
在栅栏算法的基础上
在按列读取的时候 用的是key数组的读取顺序
比如是这样的话:
1 | 2 | 3 |
2 | 3 | 1 |
则
第一次读取key[1]即第二列
第二次读取key[2]即第三列
第三次读取key[3]即第一列
其余几乎和栅栏相同
#include <iostream>
#include <string>
#include <vector>
using namespace std;
string PermuteEncrypt(string s, vector<int> key){
string primal,result;
vector<int> a;
string middle[11];
//存储并删除串中的空格
for (int i = 0; i < s.size(); i++)
if(s[i] == ' ')a.push_back(i);
else primal.push_back(s[i]);
//按置换矩阵key读取
for(int i = 0; i < primal.size(); i++){
middle[i % key.size()].push_back(primal[i]);
}
//给不足最长的部分补充*
for(int i = 1; i < key.size(); i++){
if(middle[i].size() != middle[0].size())
for(int j = middle[i].size(); j < middle[0].size(); j++)
middle[i] += '*';
}
//字符串合并
for(int i = 0; i < key.size(); i++){
result += middle[key[i]];
}
//读取并还原空格
for (int i = 0, t = 0; i < s.size(); i++)
if(a[t] == i){
result.insert(result.begin() + i,' ');
t++;
}
return result;
}
int main(){
string s;
vector<int> key;
int n;
cin>>n;
for(int i = 0; i < n; i++){
int t;
cin>>t;
key.push_back(t-1);
}
cin.get();
getline(cin,s);
cout<<PermuteEncrypt(s,key);
return 0;
}