ধরুন আমাদের কাছে n নোড সহ একটি মূলযুক্ত সাধারণ গাছ আছে, যার নোডগুলি 0 থেকে n-1 পর্যন্ত সংখ্যাযুক্ত। প্রতিটি নোডে ছোট হাতের ইংরেজি অক্ষর সহ একটি লেবেল রয়েছে। লেবেলগুলি লেবেল অ্যারেতে ইনপুট হিসাবে দেওয়া হয়, যেখানে lables[i]-এ ith নোডের জন্য লেবেল থাকে। গাছটি প্রান্ত তালিকা দ্বারা প্রতিনিধিত্ব করা হয় যেখানে প্রতিটি প্রান্ত e এর [u,v] প্রতিনিধিত্ব করে u হল পিতামাতা এবং v হল শিশু। আমাদের n আকারের একটি অ্যারে খুঁজে বের করতে হবে, ith নোডের সাবট্রিতে i
একই লেবেল সহ নোডের সংখ্যা উপস্থাপন করে।সুতরাং, যদি ইনপুট মত হয়

এখানে n =5 এবং লেবেল =“ccaca”
তাহলে আউটপুট হবে [3, 2, 1, 1, 1] কারণ একই লেবেলের সাথে রুটের তিনটি বংশধর রয়েছে, নোড 1-এর দুটি বংশধর রয়েছে এবং অন্য সকলেই সেই লেবেলটি ধরে রেখেছে।
এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -
-
E :=প্রদত্ত প্রান্ত তালিকা থেকে গ্রাফ তৈরি করুন
-
N :=প্রতিটি নোড নম্বর এবং এর সংশ্লিষ্ট লেবেল ধারণকারী একটি মানচিত্র
-
R :=n আকারের একটি তালিকা এবং 0
দিয়ে পূরণ করুন -
একটি ফাংশন r() সংজ্ঞায়িত করুন। এটি নিবে
-
C :=একটি কীর ফ্রিকোয়েন্সি ধরে রাখার জন্য একটি মানচিত্র
-
E[ni]-এর প্রতিটি e-এর জন্য, করুন
-
E[e]
থেকে ni মুছুন -
C
-এ r(e) আপডেট করুন
-
-
C
-এ N[ni] আপডেট করুন -
R[ni] :=C[N[ni]]
-
C
ফেরত দিন -
মূল পদ্ধতি থেকে r(0)
কল করুন -
R
ফেরত দিন
আরো ভালোভাবে বোঝার জন্য আসুন নিচের বাস্তবায়ন দেখি -
উদাহরণ
from collections import defaultdict, Counter
def solve(n, edges, labels):
E = defaultdict(set)
for f,t in edges:
E[f].add(t)
E[t].add(f)
N = {i:e for i,e in enumerate(labels)}
R = [0]*n
def r(ni):
C = Counter()
for e in E[ni]:
E[e].remove(ni)
C.update(r(e))
C.update((N[ni]))
R[ni] = C[N[ni]]
return C
r(0)
return R
n = 5
edges = [[0,1],[0,2],[1,3],[0,4]]
labels = "ccaca"
print(solve(n, edges, labels)) ইনপুট
5, [[0,1],[0,2],[1,3],[0,4]], "ccaca"
আউটপুট
[3, 2, 1, 1, 1]