-1

Question i was trying to solve-

" You are given a rooted tree that contains N nodes. Each node contains a lowercase alphabet. You are required to answer Q queries of type u,c, where u is an integer and c is a lowercase alphabet. The count of nodes in the subtree of the node u containing c is considered as the answer of all the queries. "

#include<bits/stdc++.h>
using namespace std;

void count(vector<vector<int>> *v,int par,string s,int arr[][26])
{
    if(v[par].size()==0)
    {
        arr[par][s[par-1]-'a']++;
        return;
    }
        
    arr[par][s[par-1]-'a']++;
    for(int i=0;i<v[par].size();i++)
    {
        count(&v,v[par][i],s,&arr);
        for(int j=0;j<26;j++)
        {
            arr[par][j]=arr[v[par][i]][j]+arr[par][j];
        }
    }
}
int main()
{
    int n,q,par,child,arr[100010][26]={};
    char alphabet;
    cin>>n>>q;
    string s;
    cin>>s;
    vector<vector<int>> v={};
    while(n--)
    {
        cin>>par>>child;
        v[par].push_back(child);
    }
    count(&v,1,s,&arr);
    while(q--)
    {
        cin>>par>>alphabet;
        cout<<arr[par][alphabet-'a']<<"\n";
    }
}

and now the errors

In function ‘void count(std::vector<std::vector<int> >*, int, std::__cxx11::string, int (*)[26])’:
13:15: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]


15:28: error: no matching function for call to ‘count(std::vector<std::vector<int> >**, __gnu_cxx::__alloc_traits<std::allocator<std::vector<int> > >::value_type&, std::__cxx11::string&, int (**)[26])’


4:6: note: candidate: void count(std::vector<std::vector<int> >*, int, std::__cxx11::string, int (*)[26])


4:6: note:   no known conversion for argument 1 from ‘std::vector<std::vector<int> >**’ to ‘std::vector<std::vector<int> >*’
62:0,
64,
1:
3959:5: note: candidate: template<class _IIter, class _Tp> typename std::iterator_traits<_Iterator>::difference_type std::count(_IIter, _IIter, const _Tp&)


3959:5: note:   template argument deduction/substitution failed:
15:28: note:   deduced conflicting types for parameter ‘_IIter’ (‘std::vector<std::vector<int> >**’ and ‘std::vector<int>’)


18:19: error: no match for ‘operator[]’ (operand types are ‘int (*)[26]’ and ‘__gnu_cxx::__alloc_traits<std::allocator<std::vector<int> > >::value_type {aka std::vector<int>}’)


 In function ‘int main()’:
35:19: error: no matching function for call to ‘count(std::vector<std::vector<int> >*, int, std::__cxx11::string&, int (*)[100010][26])’


4:6: note: candidate: void count(std::vector<std::vector<int> >*, int, std::__cxx11::string, int (*)[26])


4:6: note:   no known conversion for argument 4 from ‘int (*)[100010][26]’ to ‘int (*)[26]’
62:0,
64,
1:
3959:5: note: candidate: template<class _IIter, class _Tp> typename std::iterator_traits<_Iterator>::difference_type std::count(_IIter, _IIter, const _Tp&)


3959:5: note:   template argument deduction/substitution failed:
35:19: note:   deduced conflicting types for parameter ‘_IIter’ (‘std::vector<std::vector<int> >*’ and ‘int’)


  • 4
    May I recommend [a good C++ book](https://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list) instead of learning from "competitive programming" sites? Your code is applying operators almost randomly and while we can point out the typo that makes compiler complain, there are many more issues (like accessing non-existant elements in vector) which will be much harder to fix. – Yksisarvinen Aug 16 '20 at 12:14
  • 1
    [Why should I not #include ?](https://stackoverflow.com/q/31816095/5910058) – Jesper Juhl Aug 16 '20 at 12:15
  • 1
    [Why is "using namespace std;" considered bad practice?](https://stackoverflow.com/q/1452721/5910058) – Jesper Juhl Aug 16 '20 at 12:15
  • 1
    Also `int n,q,par,child,arr[100010][26]={};` - for a typical 32-bit integer that's roughly 10mb you are trying to allocate on the stack. Way to much for any common OS. – churill Aug 16 '20 at 12:22
  • 1
    `vector> *v` should probably be `const vector>& v`. – Jarod42 Aug 16 '20 at 12:23
  • `&arr` is a pointer to a pointer to an array of 26 `int`s, but the parameter's expected type is pointer to array of 26 `int`s (that is, `arr`). Similarly, `&v` is a pointer to a pointer to `vector>`, but the function wants a pointer to `vector>` (that is, `v`). – molbdnilo Aug 16 '20 at 12:28
  • thank you all for the help, i will keep all that in mind(will learn the basics too) – sourav singh Aug 18 '20 at 15:28

0 Answers0