PA2.pdf

‫‪ .1‬درخت قرمز سیاه‬
‫در درس ساختمان دادهها با درخت قرمز‪-‬سیاه و خصوصیات آن آشنا شدید‪ .‬دیدید که چهطور پس از درج یک عنصر جدید با استفاده از چرخش به راست‬
‫یا چپ خصوصیات این درخت حفظ میشود‪ .‬روش پیچش روش جدیدی برای درج عنصر در درخت قرمز‪-‬سیاه است که در این مسئله به شما معرفی میکنیم‪:‬‬
‫روش پیچش‪:‬‬
‫هر بار که میخواهیم عنصر جدیدی در درخت درج کنیم‪ ،‬از ریشه شروع میکنیم‪ .‬اگر عنصر جدید از گرهی فعلی کوچکتر بود به زیر درخت چپ و در‬
‫غیر اینصورت به زیر درخت راست میرویم تا جایی که به یک گرهی خالی برسیم‪ .‬عنصر جدید را به رنگ قرمز در اینجا اضافه میکنیم‪.‬‬
‫اگر پدر گرهی جدید سیاه باشد مشکلی وجود ندارد و درج پایان مییابد‪ .‬در غیر اینصورت پدر آن قرمز و پدربزرگ آن سیاه است (زیرا در درخت قرمز‬
‫سیاه پدر هر قرمزی سیاه است)‪ .‬بنابراین یکی از چهار حالت زیر به وجود میآید‪:‬‬
‫)سیاه(‪x‬‬
‫\ ‪/‬‬
‫‪T1‬‬
‫)قرمز(‪y‬‬
‫\ ‪/‬‬
‫‪T2‬‬
‫)قرمز(‪z‬‬
‫\ ‪/‬‬
‫‪T3‬‬
‫‪T4‬‬
‫)سیاه(‪x‬‬
‫\ ‪/‬‬
‫‪T1‬‬
‫)قرمز(‪z‬‬
‫\ ‪/‬‬
‫‪)y‬قرمز(‬
‫‪T4‬‬
‫\ ‪/‬‬
‫‪T2‬‬
‫‪T3‬‬
‫‪)z‬سیاه(‬
‫\ ‪/‬‬
‫‪)x‬قرمز(‬
‫‪T4‬‬
‫\ ‪/‬‬
‫‪T1‬‬
‫)قرمز(‪y‬‬
‫\ ‪/‬‬
‫‪T2‬‬
‫‪T3‬‬
‫‪)z‬سیاه(‬
‫\ ‪/‬‬
‫‪)y‬قرمز(‬
‫‪T4‬‬
‫\ ‪/‬‬
‫‪)x‬قرمز(‬
‫‪T3‬‬
‫\ ‪/‬‬
‫‪T1‬‬
‫‪T2‬‬
‫با استفاده از یک پیچش هریک از چهار حالت باال را به حالت زیر تبدیل میکنیم‪:‬‬
‫‪) y‬قرمز(‬
‫\ ‪/‬‬
‫‪/‬‬
‫\‬
‫‪) x‬سیاه(‬
‫)سیاه( ‪z‬‬
‫\ ‪/‬‬
‫\ ‪/‬‬
‫‪T1 T2 T3 T4‬‬
‫ممکن است پس از چرخش‪ ،‬پدر ‪ y‬قرمز باشد بنابراین عملیات چرخش را رو به باال ادامه میدهیم‪ .‬در آخر ممکن است به گرهی قرمزی با پدر قرمز برسیم که پدر‬
‫بزرگ ندارد‪ .‬در چنین حالتی (که امکان پیچش وجود ندارد)‪ ،‬ریشه قرمز است و کافی است رنگ آن را به سیاه تغییر دهیم تا خصوصیات درخت قرمز سیاه برقرار‬
‫شود‪.‬‬
‫تعریف مسئله‪:‬‬
‫ابتدا ‪ n‬و سپس جایگشتی از اعداد ‪ 1‬تا ‪ n‬به شما داده میشود تا آنها را به روش باال به ترتیب در درخت قرمز سیاه درج کنید و در آخر تعداد کل‬
‫پیچشها را در خروجی چاپ کنید‪.‬‬
‫‪n<=50‬‬
‫ورودی‬
‫خروجی‬
‫‪3‬‬
‫‪11‬‬
‫‪5‬‬
‫‪7‬‬
‫‪7146352‬‬
‫‪15‬‬
‫‪5 10 15 14 3 4 11 2 1 12 6 9 7 13 8‬‬
‫‪19‬‬
‫‪6 8 10 12 4 2 18 14 16 19 7 15 9 17 13 5 11 3 1‬‬
‫‪ .2‬درخت الفبــا‬
‫تعدادی رشته به ما داده شده که میتوانیم از زیررشتههای آنها استفاده کنیم‪ .‬هر بار میتوانیم دو زیر رشتهی غیر تهی از رشتهها (نه لزوما متمایز) را‬
‫انتخاب کنیم و با کنار هم گذاشتن آنها کلمهی جدیدی بسازیم‪ .‬برای مثال با دو رشتهی ‪ note‬و ‪ book‬میتوان کلماتی مانند ‪،ebook ،bot ،book‬‬
‫‪ not ،notebook‬و‪ ...‬را ساخت‪ .‬بسیاری از کلمات مانند کلمهی ‪ oo‬را نیز میتوان به چند راه مختلف ساخت (هر ‪ o‬از ‪ book‬یا از ‪ note‬باشد‪ .‬که در کل ‪9‬‬
‫حالت میشود!!!)‬
‫در این سوال شما باید با داشتن رشتههای اولیه‪ ،‬بتوانید به دست آورید که یک کلمه را به چند راه میتوان از رشتههای اولیه ساخت‪.‬‬
‫تعریف مسئله‪:‬‬
‫ابتدا ‪ n‬تعداد رشتهها داده میشود‪ .‬سپس در ‪ n‬خط بعدی ‪ n‬رشته داده میشود‪ .‬پس از آن ‪ q‬تعداد پرسمانها آمده است‪ .‬در هر یک از ‪ q‬خط بعدی یک‬
‫کلمه آمده که به ازای هرکدام باید تعداد راههای ساختن آن کلمه از ‪ n‬رشتهی دادهشده را در خروجی چاپ کنید‪.‬‬
‫محدودیت ها‪:‬طول کلمات کمتر از ‪ 500‬حرف میباشد ‪q<=10000 ، n<=100 ،‬‬
‫ورودی‬
‫خروجی‬
‫‪3‬‬
‫‪9‬‬
‫‪2‬‬
‫‪2‬‬
‫‪aa‬‬
‫‪abb‬‬
‫‪3‬‬
‫‪a‬‬
‫‪aa‬‬
‫‪aabb‬‬