using
System;
using
System.Collections.Generic;
class
GFG
{
readonly
public
static
int
numElements = 26;
public
static
List<
bool
> isPossible(
int
N, List<String> arr,
int
Q, String[] queries)
{
List<
int
[, ]> elements =
new
List<
int
[, ]>();
for
(
int
i = 0 ; i < N ; i++) {
elements.Add(
new
int
[arr[i].Length, numElements]);
for
(
int
j = 0 ; j < arr[i].Length ; j++) {
for
(
int
k = 0 ; k < numElements ; k++) {
if
(j!=0){
elements[i][j, k] = elements[i][j - 1, k];
}
}
elements[i][j, ((
int
)arr[i][j] - 97)]++;
}
}
SortedDictionary<
int
, SortedSet<
int
>> requiredRemovals =
new
SortedDictionary<
int
, SortedSet<
int
>>();
for
(
int
i = 0 ; i < numElements ; i++){
requiredRemovals.Add(i,
new
SortedSet<
int
>());
}
for
(
int
i = 0 ; i < numElements ; i++) {
for
(
int
j = 1 ; j < N ; j++) {
String a = arr[j - 1];
String b = arr[j];
int
[, ] elements1 = elements[j - 1];
int
[, ] elements2 = elements[j];
int
p1 = 0;
int
p2 = 0;
if
(elements1[a.Length - 1, i] != elements2[b.Length - 1, i]) {
foreach
( KeyValuePair<
int
, SortedSet<
int
>> pr
in
requiredRemovals){
requiredRemovals[pr.Key].Add(i);
}
}
else
{
while
(p1 < a.Length && p2 < b.Length) {
while
(p1 < a.Length && ((
int
)a[p1] - 97) != i) {
p1++;
}
while
(p2 < b.Length && ((
int
)b[p2] - 97) != i) {
p2++;
}
if
(p1 < a.Length && p2 < b.Length) {
for
(
int
k = 0 ; k < numElements; k++) {
if
(elements1[p1, k] != elements2[p2, k]){
requiredRemovals[i].Add(k);
}
}
}
p1++;
p2++;
}
}
}
}
List<
bool
> res =
new
List<
bool
>();
for
(
int
i = 0; i < Q; i++) {
SortedSet<
int
> union =
new
SortedSet<
int
>();
foreach
(
char
c
in
queries[i].ToCharArray()){
foreach
(
int
x
in
requiredRemovals[((
int
)c - 97)]){
union.Add(x);
}
}
bool
ans =
true
;
foreach
(
char
c
in
queries[i].ToCharArray()) {
if
(union.Contains((
int
)c - 97)){
ans =
false
;
}
}
res.Add(ans);
}
return
res;
}
public
static
void
Main(
string
[] args){
int
N = 3;
List<String> arr =
new
List<String>();
arr.Add(
"accbad"
);
arr.Add(
"abcacd"
);
arr.Add(
"cacbda"
);
int
Q = 6;
String[] queries =
new
String[6];
queries[0] =
"a"
;
queries[1] =
"ab"
;
queries[2] =
"ad"
;
queries[3] =
"bd"
;
queries[4] =
"bcd"
;
queries[5] =
"abd"
;
List<
bool
> ans = isPossible(N, arr, Q, queries);
foreach
(
bool
val
in
ans){
Console.Write(val +
"\n"
);
}
}
}