#include <cstdio>
#include <algorithm>
#include <cstring>
#define maxn 10010
char s[maxn][30];
bool unknown[maxn][30];
int r[maxn], len[maxn];
inline bool cmp1(int a, int b)
{
for (int i = 1; i <= len[a] && i <= len[b]; ++i)
if (s[a][i] != s[b][i]) return s[a][i] < s[b][i];
return len[a] == len[b] ? a < b : len[a] < len[b];
}
inline bool cmp2(int a, int b)
{
for (int i = 1; i <= len[a] && i <= len[b]; ++i)
if (s[a][i] != s[b][i]) return s[a][i] < s[b][i];
return len[a] == len[b] ? a > b : len[a] < len[b];
}
int main()
{
int n; scanf("%d", &n);
for (int i = 1; i <= n + 1; ++i) r[i] = i;
for (int i = 1; i <= n + 1; ++i)
scanf("%s", s[i] + 1);
for (int i = 1; i <= n + 1; ++i)
{
len[i] = strlen(s[i] + 1);
for (int j = 1; j <= len[i]; ++j)
if (s[i][j] == '?')
unknown[i][j] = 1, s[i][j] = 'a';
}
std::sort(r + 1, r + n + 2, cmp1);
int left, right;
for (int i = 1; i <= n + 1; ++i)
if (r[i] == n + 1)
{
left = i;
break;
}
for (int i = 1; i <= n + 1; ++i)
for (int j = 1; j <= len[i]; ++j)
if (unknown[i][j])
s[i][j] = 'z';
std::sort(r + 1, r + n + 2, cmp2);
for (int i = 1; i <= n + 1; ++i)
if (r[i] == n + 1)
{
right = i;
break;
}
for (int i = right; i <= left; ++i) printf("%d ", i); puts("");
return 0;
}
./Main.cpp: In function ‘int main()’:
./Main.cpp:23:24: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
int n; scanf("%d", &n);
^
./Main.cpp:26:24: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
scanf("%s", s[i] + 1);
^