Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <assert.h>
- #include <vector>
- #include <iostream>
- #define MAXN 1000000
- int maxResult = 0;
- using namespace std;
- vector<int> arr;
- void calculateAt(int i, const int MAXf, const char Q[], const int A[])
- {
- if(i >= MAXf)
- return;
- else
- {
- if(arr[i] == -1)
- {
- if(arr[A[i]] == -1)
- calculateAt(A[i], MAXf, Q, A);
- arr[i] = arr[A[i]] + (Q[i] == 'P' ? 1 : (Q[i] == 'N' ? 2 : 3));
- if(arr[i] > maxResult)
- maxResult = arr[i];
- }
- calculateAt(i+1, MAXf, Q, A);
- }
- }
- int falsifica(int N, char Q[], int A[]) {
- // Mettete qui il codice della soluzione
- // calculateAt(1, N, Q, A);
- vector<int> coda;
- int i = 1;
- coda.push_back(0);
- while(i < N)
- {
- if(arr[i] == -1)
- {
- if(arr[A[i]] == -1)
- {
- i = A[i];
- coda.push_back(i);
- continue;
- }
- // calculateAt(A[i], MAXf, Q, A);
- arr[i] = arr[A[i]] + (Q[i] == 'P' ? 1 : (Q[i] == 'N' ? 2 : 3));
- if(arr[i] > maxResult)
- maxResult = arr[i];
- }
- // if(coda.size() > 0)
- // coda.erase(coda.size()-1);
- if(coda.size() > 1)
- {
- coda.erase(coda.begin() + coda.size()-1);
- i = coda[coda.size()-1] -1;
- }
- if(coda.size() == 1)
- {
- i++;
- coda[0] = i;
- }
- }
- return maxResult;
- }
- char Q[MAXN];
- int A[MAXN];
- int main() {
- int N, i;
- freopen("input.txt", "r", stdin);
- freopen("output.txt", "w", stdout);
- cin >> N;
- Q[0] = 'X';
- A[0] = -1;
- arr.push_back(0);
- for(i=1; i<N; i++) {
- cin >> Q[i];
- cin >> A[i];
- // assert(1 == fscanf(fr, " %c", &Q[i]));
- // assert(1 == fscanf(fr, "%d", &A[i]));
- arr.push_back(-1);
- }
- cout << falsifica(N, Q, A);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement