while True:
    try:

        inputs = list(map(str, input().split()))
        s1 = inputs[0]
        s2 = inputs[1]
        len1 = int(inputs[2])
        len2 = int(inputs[3])
        #确定字母对应的范围
        a = ord("a") 
        z = ord("z")

        letter_set = {}
        for i in range(26):
            letter_set[chr(ord("a")+i)] = i

        #在len1和len2之间考察
        num = 0
        for i in range(len1, len2+1):
            #每一个长度i里只考虑s1,s2中的前i项,不足的就补一个0在后面,但是要求考察的这个数在这个长度下每一位都是满的
            #s1,s2看作i位的26进制数字,不够的看为0,把它们转化为10进制数字n1,n2
            n1 = 0
            n2 = 0
            for j in range(i):
                if j <= len(s1):
                    n_tmp = ord(s1[j]) - a
                    n1 += n_tmp*26**(i - j - 1)
                if j <= len(s2):
                    n_tmp = ord(s2[j]) - a
                    n2 += n_tmp*26**(i - j - 1)
            num += n2 - n1
            if i == len(s2):
                num -= 1
        print(num)
    except:
        break

就是把字母看成26进制的数字串,len1到len2为取头多少位构建一个26进制的数字,比如s1= ab, s2 = ce,遍历到长度为i = 1时候(i~[len1, len2]),当前步里只考察前1项,即a和c,由于是26进制,所以a=0,b=1...z=25,就想象数字0123456789本质也都是字母,0是当中在每一位中能出现的最小的数字,所以a=0;如果s1,s2没有i这么长,构建i位26进制数时就给后面都补上a,相当于补0。每一个i长度下,构建出s1,s2对应的26进制数后转换位10进制数n1,n2,那么在i长度下符合要求的组合数就是n2 - n1个。求出所有长度i下的组合数的和(当len1到len2中有一个长度等于s2的长度时是会包括一个跟s2的值一样的数,所以应该在该长度下减去1)。