Problem:
Max Score: 250 Points

Problem Statement

Mr.X, who the handle name is T, looked at the list which written N handle names, S_1, S_2, ..., S_N.

But he couldn't see some parts of the list. Invisible part is denoted ?.

Please calculate all possible index of the handle name of Mr.X when you sort N+1 handle names (S_1, S_2, ..., S_N and T) in lexicographical order.

Note: If there are pair of people with same handle name, either one may come first.

Input

The input is given from standard input in the following format.

N
S_1
S_2
:
S_N
T

Output

Calculate the possible index and print in sorted order. The output should be separated with a space. Don't print a space after last number.

Put a line break in the end.

Constraints

1 ≤ N ≤ 10000

1 ≤ |S_i|, |T| ≤ 20 (|A| is the length of A.)

S_i consists from lower-case alphabet and ?.

T consists from lower-case alphabet.

Scoring

Subtask 1 [ 130 points ]

There are no ?'s.

Subtask 2 [ 120 points ]

There are no additional constraints.

Sample Input 1

2
tourist
petr
e

Sample Output 1

1

There are no invisible part, so there are only one possibility.
The sorted handle names are e, petr, tourist, so e comes first.

Sample Input 2

2
?o?r?s?
?et?
e

Solution in C++14 (GCC 5.4.1) (judge verdict: Wrong Answer)

#include<iostream>
#include<stdio.h>
#include<string>
using namespace std;

int main()
{
	int n, small = 0, large;
	cin >> n;
	large = n;
	string s[10000], t;
	for (int i = 0; i < n; i++)
	{
		cin >> s[i];
	}
	cin >> t;
	int g = 0;
	for (int i = 0; i < n; i++)
	{
		if (s[i] == t) {}
		else {
			int len = s[i].size();
			for (int j = 0; j < len+1; j++)
			{
				if (s[i][j] == false && t[j] == true) { small++; break; }
				if (s[i][j] == false && t[j] == false)break;
				if (s[i][j] == true && t[j] == false) { large++; break; }
				if (s[i][j] != '?') {
					s[i][j] = tolower(s[i][j]);
					if ((int)s[i][j] > (int) t[j])large--;  break;
					if ((int)s[i][j] < t[j])small++; break;
				}
				else { break; }
			}
		}
	}
	//cout << small << endl << large << endl;;
	for (int i = small; i <=large ; i++)
	{
		if (i == small) { cout << i + 1; if (i == large)cout << endl; }
	    else if(i == large)cout << " " << i + 1 << endl;
		else if(i!=small&&large!=i) { cout << " " << i + 1; }
	}
}