• [思维]Longest Common Subsequence 2022牛客多校第8场 F


    题目描述

    Given sequence ss of length nn and sequence tt of length mm, find the length of the longest common subsequence of ssand tt.

    输入描述:

    There are multiple test cases. The first line of input contains an integer TT(1≤T≤1031≤T≤103), the number of test cases.
    
    For each test case:
    
    The only line contains 77 integers, nn, mm, pp, xx, aa, bb, cc (1≤n1≤n, m≤106m≤106, 0≤x0≤x, aa, bb, c

    输出描述:

    For each test case:
    
    Output an integer -- the length of the longest common subsequence of ss and tt, in one line.

    示例1

    输入

    2
    4 3 1024 1 1 1 1
    3 4 1024 0 0 0 0

    输出

    0
    3

    说明

    In the first sample, s=[3,13,183,905]s=[3,13,183,905] and t=[731,565,303]t=[731,565,303].
    
    In the second sample, s=[0,0,0]s=[0,0,0] and t=[0,0,0,0]t=[0,0,0,0].

    题意: 给出一个长度为n的数组以及一个长度为m的数组,求它们的最长公共子序列,数组中的值按照一定规则生成,给出x、a、b和c,令x = a*x^2 + b*x + c,然后把x填入数组中第i个位置,如此往复直至遍历完数组。

    分析: 由于n和m都是1e6级别的,所以没法直接跑n^2的lcs算法,可以注意到两个数组中数据生成都是有规律的,第i+1个位置的值是通过第i个位置的值得到的,如果一旦出现a[i]等于b[j],那么a数组第i个位置和b数组第j个位置后面的值一定是相同的,所以问题就很好解决了,只需要记录下a数组中a[i]首次出现的位置,然后遍历b数组,当b[i]在a数组中出现过时,就可以更新一次答案,最终结果取最大值。

    具体代码如下:

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. using namespace std;
    9. unordered_map<int, int> mp;
    10. signed main()
    11. {
    12. int T;
    13. cin >> T;
    14. while(T--){
    15. mp.clear();
    16. int n, m, p, x, a, b, c;
    17. scanf("%d%d%d%d%d%d%d", &n, &m, &p, &x, &a, &b, &c);
    18. for(int i = 1; i <= n; i++){
    19. x = ((1ll*a*x%p*x%p+1ll*b*x%p)%p+c)%p;
    20. if(!mp.count(x))
    21. mp[x] = i;
    22. }
    23. int ans = 0;
    24. for(int i = 1; i <= m; i++){
    25. x = ((1ll*a*x%p*x%p+1ll*b*x%p)%p+c)%p;
    26. if(mp[x]) ans = max(ans, min(n-mp[x]+1, m-i+1));
    27. }
    28. printf("%d\n", ans);
    29. }
    30. return 0;
    31. }

  • 相关阅读:
    基于Apache部署虚拟主机网站
    colmap+openMVS稠密重建
    7月 致 -.-- -..- -
    来分析两道小题
    网络规划设计师上午真题及解析(2019)
    【C++】不是用new生成的对象调用析构函数
    一个事件订阅和发布的库(onfire.js)的源码浅析
    Leetcode 16.07 最大数值
    BiSeNet v2
    Mybatis | Mybatis标签collection一对多的使用
  • 原文地址:https://blog.csdn.net/m0_55982600/article/details/126336861