思路:一开始我是对着这个示例进行模拟,没发现什么规律,然后我考虑每种字符如何对答案产生贡献,发现每种字符的贡献就是考虑这个字符在字串中作为第一个子串和中间字(包括末尾)出现的次数。
举个例子 ababa
a的贡献有
- a (第一个a)
- ab
- aba
- abab
- ababa
- ba
- bab
- baba
- a(第二个a)
- ab
- aba
- ba
- a(第三个a)
很明显,我只需统计每个字符在字串中作为第一个子串(黑色串)和中间字串(包括末尾)(蓝色串)出现的次数能保证不多不漏。
代码:
mp=[[]for i in range(26)]
s=input()
a=0
l=len(s)
for i in range(l):
mp[ord(s[i])-ord("a")].append(i+1)
a+=(l-i)
ans=[[]for i in range(26)]
for i in range(26):
if (len(mp[i])!=0):
ans[i].append(mp[i][0]-1)
for i in range(26):
for j in range(1,len(mp[i])):
ans[i].append(mp[i][j]-mp[i][j-1]-1)
for i in range(26):
for j in range(len(ans[i])):
a+=(ans[i][j]*(l-mp[i][j]+1))
#print(ord("b")-ord("a"))
print(a)
通过情况: