Approach

Written by Hanyuan Li from CSESoc Competitions

In this question, we're asked to find the number of times a variable has been dereferenced, based on the &s and *s behind that variable. If we ever end up dereferencing a raw value, however, the program should output not possible.

To solve this problem, we just need to iterate over the string, from right to left (since &s and *s are processed from right to left). We know the length of the string as one of our inputs, so all we have to do is set our while-loop counter to start from the last index of the string:

int length; // Argument in solve()
int index = length - 1; // Remember strings are 0-indexed, so we have to subtract
// 1 to get the last character in a string with length `length`
while (index > 0) {
// Do stuff here
index--;
}

We also need to know how many references there are. Whenever we &, we reference our variable, and whenever we * we dereference it. So we can add some extra parts to our program:

int length; // Argument in solve()
int index = length - 1; // Remember strings are 0-indexed, so we have to subtract
// 1 to get the last character in a string with length `length`
int references = 0;
while (index > 0) {
char current = input[index];
// Increment/decrement our reference count accordingly
if (current == '&') {
references++;
} else {
references--;
}
index--;
}

Now we need to do one more check for when we try to dereference a raw value (i.e. do * on a variable that isn't referenced). We will need to print not possible when that happens, so we can have a check for that too:

int length; // Argument in solve()
int index = length - 1; // Remember strings are 0-indexed, so we have to subtract
// 1 to get the last character in a string with length `length`
int references = 0;
while (index > 0) {
char current = input[index];
// Increment/decrement our reference count accordingly
if (current == '&') {
references++;
} else {
references--;
}
if (references < 0) {
printf("not possible\n");
return;
}
index--;
}

Now we have the number of references to our variable. We can simply print pointer to (plus a space) that many times, followed by c.