Maximum Palindromes

  • + 0 comments
    import sys
    MOD = 1000000007
    
    MAX_N = 100000
    fact = [1] * (MAX_N + 1)
    inv_fact = [1] * (MAX_N + 1)
    
    def mod_inv(x, mod):
        return pow(x, mod - 2, mod) 
    for i in range(2, MAX_N + 1):
        fact[i] = fact[i - 1] * i % MOD
    inv_fact[MAX_N] = mod_inv(fact[MAX_N], MOD)
    for i in range(MAX_N - 1, 0, -1):
        inv_fact[i] = inv_fact[i + 1] * (i + 1) % MOD
    
    prefix_freq = []
    
    def initialize(s):
        global prefix_freq
        n = len(s)
        prefix_freq = [[0] * 26 for _ in range(n + 1)]
        
        for i in range(n):
            prefix_freq[i + 1] = prefix_freq[i][:] 
            prefix_freq[i + 1][ord(s[i]) - ord('a')] += 1
    
    def answerQuery(l, r):
        freq = [prefix_freq[r][i] - prefix_freq[l - 1][i] for i in range(26)]
        
        even_sum = sum(f // 2 for f in freq)
        odd_count = sum(1 for f in freq if f % 2 == 1)
        
    
        result = fact[even_sum] 
        for f in freq:
            if f // 2 > 0:
                result = result * inv_fact[f // 2] % MOD  
        return result * max(1, odd_count) % MOD