2022牛客蔚来杯第八场
文章目录
F.Longest Common Subsequence
-
题意
- 用a,b,c,x,p通过式子ax^2+bx+c(mod p)来依次构造n+m长度的序列,前n个为串s,后m个为串t
- 问s和t的最长公共子序列长度为多少
-
题解
- 由于每个数都是由前一个数通过相同的变化转化来的,所以一旦两串中有某个数相同,那么后面所有的数都相同。因此只需从前向后依次用map配对记录个数即可。
-
代码
#include <iostream>
#include <map>
using namespace std;
const int N=1e6+10;
map<int,long long> h;
void solve() {
h.clear();
long long n,m,p,x,a,b,c,ans=0;
cin>>n>>m>>p>>x>>a>>b>>c;
for(int i=1;i<=n;i++) x=((a*x%p*x%p+b*x%p)%p+c)%p,h[x]++;
for(int i=1;i<=m;i++) {
x=((a*x%p*x%p+b*x%p)%p+c)%p;
if(h[x]) ans++,h[x]--;
}
cout<<ans<<'\n';
}
int main() {
int t;
cin>>t;
while(t--) solve();
return 0;
}
D.Poker Game: Decision
-
题意
* -
题解
* -
代码