الإزاحة الدورية والبحث عن السلاسل الفرعية المكررة

C# Hard loops

مهمة «الإزاحة الدورية والبحث عن السلاسل الفرعية المكررة»

بالنظر إلى سلسلة S مكونة من حروف لاتينية صغيرة. من الضروري إجراء إزاحة دائرية لليسار للسلسلة بمقدار K موضعًا (يمكن أن يكون K أكبر من طول السلسلة). بعد الإزاحة، ابحث عن جميع السلاسل الفرعية المتكررة غير المتداخلة بطول L (L معطى) في السلسلة الجديدة. السلسلة الفرعية المتكررة هي سلسلة فرعية تظهر في السلسلة مرتين أو أكثر، ويجب ألا تتداخل ظهوراتها. أخرج عدد هذه السلاسل الفرعية والسلاسل الفرعية نفسها بترتيب معجمي. إذا لم تكن هناك سلاسل فرعية من هذا القبيل، أخرج 0.

تنسيق الإدخال

في السطر الأول، عدد صحيح N (1 ≤ N ≤ 1000) — طول السلسلة النصية. في السطر الثاني، السلسلة النصية S نفسها. في السطر الثالث، عدد صحيح K (0 ≤ K ≤ 10^9) — عدد الإزاحات. في السطر الرابع، عدد صحيح L (1 ≤ L ≤ N) — طول السلسلة الفرعية.

تنسيق الإخراج

في السطر الأول، أخرج عددًا صحيحًا M — عدد السلاسل الفرعية المتكررة غير المتداخلة ذات الطول L. إذا كان M > 0، في السطور M التالية أخرج السلاسل الفرعية نفسها بترتيب معجمي.

أمثلة

مثال 1

الإدخال
5 abcde 3 2
الإخراج
0

مثال 2

الإدخال
10 abracadabra 5 4
الإخراج
1 abra
main.cs