这算是个模板,计算两组1~n的数 循环个数
离散数学中的置换群应用,答案就是找出所有循环的个数(循环长度必须大于1),最后用n-sum(sum为循环个数),每个循环必有一个与其他不同,每个循环牺牲一个元素。就是LCS。
#include<iostream> #include<cstdio> using namespace std; int main(){ int t,a[100005],b[100005],pa[100005],pb[100005],vis[100005]; cin >> t; while(t--){ int n; scanf("%d",&n); int temp; for(int i = 1;i <= n;i++){ // cin >> a[i]; scanf("%d",a+i); } for(int i = 1;i <= n;i++){ // cin >> b[i]; scanf("%d",b+i); pb[b[i]] = i; } // memset(vis,0,sizeof(vis)); for(int i = 1;i <= n;i++){ vis[i] = 0; } /* for(int i = 1;i <= n;i++){ cout << a[i] << " "; } cout << endl; for(int i = 1;i <= n;i++){ cout << b[i] << " "; } cout << endl; for(int i = 1;i <= n;i++){ cout << pb[i] << " "; } cout << endl; for(int i = 1;i <= n;i++){ cout << pb[a[i]] << " "; } cout << endl; */ //开始找环 int sum = 0; for(int i = 1;i <= n;i++){ if(!vis[i]){ int now = i; int len = 0; while(!vis[now]){ vis[now] = 1; now = pb[a[now]]; len++; } //cout << len << endl; if(len > 1){ sum++; } } } cout << n - sum << endl; } return 0; }