学习用矩阵做置换的过程很有趣,我遇到的置换问题最开始的思路就向矩阵发展了,然而很不幸,那题时间卡的紧,用矩阵是超时的做法(反正我没过)。不过我也意外的学习了这样的方法:
经典的置换矩阵:
比如:1 2 3 4 ---> 2 4 1 3
设转换矩阵是A。
给出置换方法:
表示第位置上的字符换到i位置上
所以
通过将置换操作分离出来成快速幂,最后和被操作序列做乘法,缩短时间。估计时间:O(nm) --> O(logn+m)
输入: 10 4 5 3 7 2 8 1 6 10 9 1 Hello Bob 1995 CERC
#include
#include
#include
using namespace std;
const int N=205;
int n;
char mys[N],cont[N];
struct matrix{
int m[N][N];
}I;
int add(int a,int b){
int ans=0;
while(b){
if(b&1) ans=ans+a;
a=a+a;
b>>=1;
}
return ans;
}
matrix operator *(const matrix a,const matrix b){
matrix ans;
for(int i=0;i>=1;
}
return ans;
}
void show(matrix mp){
for(int i=0;i
#include
#include
#include
using namespace std;
const int N=205;
int a[N];
int cir[N];
char str[N];
char ans[N];
bool vis[N];
int main()
{
//freopen("cin.txt","r",stdin);
int n;
while(scanf("%d",&n)&&n){
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1;i<=n;i++){
memset(vis,0,sizeof(vis));
int dex=i;
int loop=0;
while(vis[dex]==0){
loop++;
vis[dex]=1;
dex=a[dex];
}
cir[i]=loop;
}
int k;
while(scanf("%d",&k)&&k){
memset(ans,0,sizeof(ans));
getchar();
gets(str+1);
int len=strlen(str+1);
for(int i=1;i<=n;i++){
int d=k%cir[i];
int dex=i;
for(int j=0;jlen) ans[dex]=' ';
else ans[dex]=str[i];
}
ans[n+1]=0;
printf("%s\n",ans+1);
}
printf("\n");
}
return 0;
}
输入:
7 5 8 6 1 3 7 5 2 4 3 2 4 5 6 7 1 7 1 3 4 5 2 6 5 6 7 3 1 2 4 2 7 3 4 6 1 5解释:
6 1 3 7 5 2 4 就是把6位置上的元素换到1位置上,1位置上的元素换到2位置上…… 经典的置换操作, .
粗略的讲就是 B=(1,2,3……n)'
#include
#include
#include
using namespace std;
const int N=105;
struct matrix{
int m[N][N];
int nn,mm;
matrix operator =(const matrix a){
nn=a.nn;
mm=a.mm;
for(int i=0;i>=1;
}
return ans;
}
void show(matrix v){
cout<<"show: "<