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#