# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1274660 | Robert_junior | Painting Walls (APIO20_paint) | C++20 | 0 ms | 0 KiB |
#include <bits/stdc++.h>
using namespace std;
int main() {
int n, m, k;
cin>>n>>m>>k;
vector<100010> c(n), a(m), dp(n);
vector<vector<int>> b;
for(int i = 0; i < n; i++){
cin>>c[i];
dp[i] = n + 1;
}
for(int i = 0; i < m; i++){
cin>>a[i];
b.push_back(vector<int>(a[i]));
for(int j = 0; j < a[i]; j++){
cin>>b[i][j];
//cout<<b[i][j]<<' ';
}
//cout<<'\n';
}
vector<int>used(n);
bitset<500>is[m];
for(int i = 0; i < m; i++){
for(auto it : b[i]){
is[i][it] = 1;
}
}
for(int i = 0; i < m; i++){
int o = i, oo = 0;
while(oo < m && is[o][c[oo]]){
oo++;
o = (o + 1) % m;
}
if(oo == m){
for(int j = 0; j < m; j++) dp[j] = 1;
}
}
for(int i = 1; i <= n - m; i++){
for(int j = 0; j < m; j++){
int o = j, oo = i;
while(oo < i + m && is[o][c[oo]]){
oo++;
o = (o + 1) % m;
}
if(oo == i + m){
for(int l = i; l < i + m; l++){
dp[l] = min(dp[l], dp[i - 1] + 1);
}
}
}
}
cout<<dp[n - 1];
}