/*假设密钥的长度为 M ,相当于把明文按顺序分成了 M 块,每块长度不齐的地方补 E ,对密钥进行枚举,每次把最小的且没有被标记过的那一块字符串输出,其实还是一个模拟类型的题目,细心就好。*/
- #include<functional>
- #include<algorithm>
- #include<iostream>
- #include<fstream>
- #include<sstream>
- #include<iomanip>
- #include<numeric>
- #include<cstring>
- #include<cassert>
- #include<cstdio>
- #include<string>
- #include<vector>
- #include<bitset>
- #include<queue>
- #include<stack>
- #include<cmath>
- #include<ctime>
- #include<list>
- #include<set>
- #include<map>
- using namespace std;
- char s1[25],s2[1010],s[1010];
- int main()
- {
- gets(s1);
- gets(s);
- int len1=strlen(s1);
- int len=strlen(s);
- int len2=0;
- for(int i=0;i<len;i++)
- if(s[i]!=' ')
- s2[len2++]=s[i];
- int Len;
- s2[len2]='\n';
- if(len2%len1) Len=(len2/len1+1)*len1;
- else Len=len2;
- bool vis[25];
- memset(vis,false,sizeof(vis));
- for(int i=1;i<=len1;i++){
- int minn=200,k;
- for(int j=0;j<len1;j++)
- if(!vis[j]&&s1[j]<minn){
- minn=s1[j];k=j;
- }
- vis[k]=true;
- int j;
- for(j=k;j<len2;j+=len1)
- (s2[j]>'Z') ? printf("%c",s2[j]-32) : printf("%c",s2[j]);
- if(j<Len) cout<<"E";
- }
- cout<<endl;
- return 0;
- }