F - Longest Common Subsequence
代码
//map写法
void solve()
{
cin >> n >> m;
cin >> p >> x >> a >> b >> c;
s[0] = x;
for (int i = 1; i <= n; i++)
{
s[i] = f(s[i - 1]) % p;
}
t[0] = s[n];
map<int, int> mp;
for (int i = 1; i <= m; i++)
{
t[i] = f(t[i - 1]) % p;
mp.insert({t[i], i});
}
int ans = 0;
for (int i = 1; i <= n; i++)
{
auto it = mp.find(s[i]);
if (it != mp.end())
{
int index = it->second;
int len = min(n - i + 1, m - index + 1);
ans = max(ans, len);
}
}
cout << ans << endl;
}
//set写法
struct cmp
{
bool operator()(const pii a, const pii b)
{
if (a.first == b.first) //去重
return false;
return a.first < b.first; //排序
}
};
bool operator==(const pii a, const pii b) //查找
{
if (a.first == b.first)
return true;
return false;
}
void solve()
{
cin >> n >> m;
cin >> p >> x >> a >> b >> c;
s[0] = x;
for (int i = 1; i <= n; i++)
{
s[i] = f(s[i - 1]) % p;
}
t[0] = s[n];
set<pii, cmp> st;
for (int i = 1; i <= m; i++)
{
t[i] = f(t[i - 1]) % p;
pii a;
st.insert({t[i], i});
}
int ans = 0;
for (int i = 1; i <= n; i++)
{
auto pos = st.find({s[i], 0});
int index = pos->second;
if (index != 0)
{
int len = min(n - i + 1, m - index + 1);
ans = max(ans, len);
}
}
cout << ans << endl;
}