20220813牛客第八场

Longest Common Subsequence

题目大意:
给定n,m,p,x,a,b,c七个数,n是数组1的长度,m是数组2的长度,先给数组1依次赋值,再给数组2依次赋值。
赋值的值为x,每次赋值之前x都更新为(axx + b*x + c) mod p
问最后a与b中的最长公共子序列

input:
2
4 3 1024 1 1 1 1
3 4 1024 0 0 0 0

output:
0
3

解:
在两个数组中找到相同的值,那么两个数组后面所有的值都相同

#include<bits/stdc++.h>
using namespace std;

#define endl '\n'

#define int long long

int n, m, x, a, b, c, p;
unordered_map<int, int> map1;

void solve() {
    map1.clear();
    cin >> n >> m >> p >> x >> a >> b >> c;
    a %= p, b %= p, c %= p, x %= p;
    int i, j;
    for (i = 1; i <= n; i++) {
        x = (a * x % p * x % p + b * x % p + c) % p;
        if (map1.count(x) == 0) {
            map1[x] = i;
        }
    }
    int res = 0;
    for (j = 1; j <= m; j++) {
        x = (a * x % p * x % p + b * x % p + c) % p;
        if (map1.count(x) > 0) {
            i = map1[x];
            res = max(res, min(n - i + 1, m - j + 1));
        }
    }
    cout << res << endl;
}

signed main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int t;
    cin >> t;
    while (t--) {
        solve();
    }
}

其他的题目不是给我这种菜鸡做的

#ACM#
全部评论

相关推荐

真烦好烦真烦:牛友太有实力了
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务