using
System;
using
System.Collections.Generic;
class
GFG {
static
int
__gcd(
int
a,
int
b)
{
if
(b == 0) {
return
a;
}
return
__gcd(b, a % b);
}
static
string
StringGCD(
string
a,
string
b)
{
int
gcd = __gcd(a.Length, b.Length);
string
s1 =
""
, s2 =
""
;
for
(
int
i = 0; i < gcd; i++) {
s1 += a[i];
}
for
(
int
i = 0; i < gcd; i++) {
s2 += b[i];
}
if
(s1.Equals(s2)) {
string
temp1 =
""
, temp2 =
""
;
for
(
int
i = 1; i <= b.Length / gcd; i++) {
temp1 += a;
}
for
(
int
i = 1; i <= a.Length / gcd; i++) {
temp2 += b;
}
if
(temp1.Equals(temp2))
return
s1;
}
return
" "
;
}
static
bool
isIncreasing(List<
string
> arr)
{
for
(
int
i = 0; i < arr.Count - 1; i++) {
if
(
string
.Compare(arr[i], arr[i + 1]) >= 0)
return
false
;
}
return
true
;
}
static
List<
string
> sortByGcd(List<
string
> arr,
List<
string
> k)
{
string
prev =
""
;
for
(
int
i = 0; i < arr.Count; i++) {
string
optEle = arr[i];
bool
flag =
true
;
foreach
(
string
j
in
k)
{
string
Ele = StringGCD(arr[i], j);
if
(Ele.CompareTo(prev) > 0 && flag) {
optEle = Ele;
flag =
false
;
}
if
(Ele.CompareTo(prev) > 0) {
optEle = (optEle.CompareTo(Ele) < 0)
? optEle
: Ele;
}
}
arr[i] = optEle;
prev = arr[i];
}
if
(isIncreasing(arr)) {
return
arr;
}
return
new
List<
string
>();
}
public
static
void
Main(
string
[] args)
{
List<
string
> arr
=
new
List<
string
>{
"geeks"
,
"for"
,
"geeks"
};
List<
string
> k =
new
List<
string
>{
"geeks"
,
"for"
};
foreach
(
string
str
in
sortByGcd(arr, k))
{
Console.Write(
"'"
+ str +
"', "
);
}
}
}