循环节 hdu5495 LCS
2015-10-12 00:55
330 查看
传送门:点击打开链接
题意:告诉你两个序列An和Bn,都是{1,2,,...n}的排列,然后现在可以任意交换每一列,问之后能构成最长公共子序列是多长
思路:首先想特殊点,想到A中1的位置,假如我们把A中1的那一列移动到最前面去,如果对应的B也是1,那么刚好就是相等的,那么肯定能使公共子序列长度+1,如果不相等,假如A是1,B是3,那么我要让3能立即构成公共子序列,就要让下一次的A为3,再看此时的B是多少,依次类推
看下样例是如何变换的应该就好理解了
最初的样例
1 5 3 2 6 4 7
3 6 2 4 5 1 7
变换后
1 3 2 4 5 6 7
3 2 4 1 6 5 7
我们可以发现可以分成两组,第一组形成了循环节,公共子序列长度是3,第二组形成了循环节,公共子序列长度是1,第三组恰好相等,公共子序列长度是1
所以我们就能确定了,如果A就等于B,首先让答案等于n,然后找有多少个循环节,如果循环节的长度为1那么ans不变,如果循环节的长度大于1,那么就让答案减一
如上面,长度不唯一的循环节有2个,所以答案就是7-2=5
题意:告诉你两个序列An和Bn,都是{1,2,,...n}的排列,然后现在可以任意交换每一列,问之后能构成最长公共子序列是多长
思路:首先想特殊点,想到A中1的位置,假如我们把A中1的那一列移动到最前面去,如果对应的B也是1,那么刚好就是相等的,那么肯定能使公共子序列长度+1,如果不相等,假如A是1,B是3,那么我要让3能立即构成公共子序列,就要让下一次的A为3,再看此时的B是多少,依次类推
看下样例是如何变换的应该就好理解了
最初的样例
1 5 3 2 6 4 7
3 6 2 4 5 1 7
变换后
1 3 2 4 5 6 7
3 2 4 1 6 5 7
我们可以发现可以分成两组,第一组形成了循环节,公共子序列长度是3,第二组形成了循环节,公共子序列长度是1,第三组恰好相等,公共子序列长度是1
所以我们就能确定了,如果A就等于B,首先让答案等于n,然后找有多少个循环节,如果循环节的长度为1那么ans不变,如果循环节的长度大于1,那么就让答案减一
如上面,长度不唯一的循环节有2个,所以答案就是7-2=5
#include<map> #include<set> #include<cmath> #include<ctime> #include<stack> #include<queue> #include<cstdio> #include<cctype> #include<string> #include<vector> #include<cstring> #include<iostream> #include<algorithm> #include<functional> #define fuck printf("fuck") #define FIN freopen("input.in","r",stdin) #define FOUT freopen("output.txt","w+",stdout) using namespace std; typedef long long LL; const int MX = 1e5 + 5; int A[MX], B[MX], nxt[MX], vis[MX]; int main() { int T, n; //FIN; scanf("%d", &T); while(T--) { memset(vis, 0, sizeof(vis)); scanf("%d", &n); for(int i = 1; i <= n; i++) { scanf("%d", &A[i]); } for(int i = 1; i <= n; i++) { scanf("%d", &B[i]); } for(int i = 1; i <= n; i++) { nxt[A[i]] = B[i]; } int ans = n; for(int i = 1; i <= n; i++) { if(vis[i]) continue; vis[id] = 1; int id = i, now = nxt[id]; if(now == id) continue; ans--; while(now != id) { vis[now] = 1; now = nxt[now]; } } printf("%d\n", ans); } return 0; }
相关文章推荐
- Part 52 Attributes in C#
- 【人脸识别】人脸验证算法Joint Bayesian详解及实现(Python版)
- Part 48 to 51 Talking about Access Modifiers in C#
- Xcode6使用storyboard在TabBarController上建立三个以上Item
- jks读取密钥
- 高德、百度地图自定义底图
- FS ext2_super_block
- Part 59 to 60 Difference between Convert ToString and ToString,String and StringBuilder
- CentOS7安装MySQL5.6.27数据库
- Part 57 to 58 Why should you override ToString and Equal Method
- 双十一来了,别让你的mongodb宕机了
- Textview 文本旋转,倾斜
- java integer对象判断两个数字是否相等
- php——phpAjax
- Machine Learning 20151012
- J2EE Web项目Tomcat跑不起来的一些问题解决过程汇总
- Divide Two Integers
- Toast显示过程详解
- 黑马程序员-------Block
- css制作三角形