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#