简单版本
由于k的数据范围很小,而且p,q是自己给定的,不用自己去寻找,所以只要做一个数组分段就可以了
void print(vector<int> q)
{
ll r = 0;
vector<int> kk;
for (int l = 1, r = 1;l <= n;l = r + 1, r = l)
{
vector<int> t;
t.push_back(q[l-1]);
//找到所有同色的
while (l<n&&col[l] == col[r+1]) t.push_back(q[r]), r++;
//排序
sort(t.begin(), t.end(), [](const int a, const int b) {
return a > b;
});
for (int i = 0;i < t.size();i++)
kk.push_back(t[i]);
}
auto qq = div(kk, r);
cout << r << '\n';
}
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
const int N = 1e5 + 10;
const int mod = 1e9 + 7;
int col[N], a[N];
int n, m, k;
typedef long long ll;
struct node
{
string s;
};
vector<int> div(vector<int> q,ll &r)
{
vector<int> C;
for (int i = 0;i < q.size();i++)
{
r = r * 10 + q[i];
C.push_back(r / mod);
r =r% mod;
}
reverse(C.begin(), C.end());
while (C.size() > 1 && C.back() == 0) C.pop_back();
return C;
}
void print(vector<int> q)
{
ll r = 0;
vector<int> kk;
for (int l = 1, r = 1;l <= n;l = r + 1, r = l)
{
vector<int> t;
t.push_back(q[l-1]);
while (l<n&&col[l] == col[r+1]) t.push_back(q[r]), r++;
sort(t.begin(), t.end(), [](const int a, const int b) {
return a > b;
});
for (int i = 0;i < t.size();i++)
kk.push_back(t[i]);
}
auto qq = div(kk, r);
cout << r << '\n';
}
int main()
{
cin >> n >> m >> k;
string s;
cin >> s;
s = " " + s;
for (int i = 1;i <= n;i++)
cin >> col[i];
vector<int> q;//q.push_back(0);
for (int i = 1;i <= n;i++)
q.push_back(s[i] - '0');
print(q);
while (k--)
{
int x, y;
cin >> x >> y;
for (int i = 1;i <= n;i++)
if (col[i] == x) col[i] = y;
print(q);
}
return 0;
}