维护$n^{2}$个三元组$(x,y,z)$,每一个三元组描述$a_{x,y}=z$
对于RLDU这四个操作,即将所有三元组的$x$或$y$执行$pm 1$(模$n$意义下)
对于IC这两个操作,即分别将$y$和$z$交换或$x$和$z$交换
维护这三个元素交换的顺序以及每一个元素加减的量,最终再$o(n^{2})$解出即可
时间复杂度为$o(n^{2}+m)$,可以通过

1 #include<bits/stdc++.h> 2 using namespace std; 3 #define N 1005 4 #define M 100005 5 int t,n,m,num[11],p[3],d[3],b[3],a[N][N],ans[N][N]; 6 char s[M]; 7 int read(){ 8 int x=0; 9 char c=getchar(); 10 while ((c<'0')||(c>'9'))c=getchar(); 11 while ((c>='0')&&(c<='9')){ 12 x=x*10+c-'0'; 13 c=getchar(); 14 } 15 return x; 16 } 17 void write(int x,char c=''){ 18 while (x){ 19 num[++num[0]]=x%10; 20 x/=10; 21 } 22 if (!num[0])putchar('0'); 23 while (num[0])putchar(num[num[0]--]+'0'); 24 putchar(c); 25 } 26 int main(){ 27 t=read(); 28 while (t--){ 29 n=read(),m=read(); 30 for(int i=1;i<=n;i++) 31 for(int j=1;j<=n;j++)a[i][j]=read(); 32 scanf("%s",s); 33 //当前第i维为原来第pi维+di 34 p[0]=0,p[1]=1,p[2]=2,d[0]=d[1]=d[2]=0; 35 for(int i=0;i<m;i++){ 36 if (s[i]=='R')d[1]++; 37 if (s[i]=='L')d[1]--; 38 if (s[i]=='D')d[0]++; 39 if (s[i]=='U')d[0]--; 40 if (s[i]=='I'){ 41 swap(p[1],p[2]); 42 swap(d[1],d[2]); 43 } 44 if (s[i]=='C'){ 45 swap(p[0],p[2]); 46 swap(d[0],d[2]); 47 } 48 } 49 for(int i=1;i<=n;i++) 50 for(int j=1;j<=n;j++){ 51 b[0]=i,b[1]=j,b[2]=a[i][j]; 52 int x=((b[p[0]]+d[0])%n+n-1)%n+1; 53 int y=((b[p[1]]+d[1])%n+n-1)%n+1; 54 int z=((b[p[2]]+d[2])%n+n-1)%n+1; 55 ans[x][y]=z; 56 } 57 for(int i=1;i<=n;i++){ 58 for(int j=1;j<n;j++)write(ans[i][j],' '); 59 write(ans[i][n],' '); 60 } 61 } 62 return 0; 63 }