子串分值和
分析:
- 考虑每个字符在多少种子串中有价值,即在多少种子串中时第一次出现,第一次出现可能出现在任何位置(开头,中间,最后)
- 用last[]来记录他最后出现的位置,到第i个字符时,包含它的子串的起点可能i-last[s[i]]中的任何一个,起点有i-last[s[i]]种,终点可能是包含他以及它后面的任何位置,终点有n-i+1种,则包含他的子串有sum=(i-last[s[i]])*(n-i+1)种,则它在sum个子串中每个提供一点价值
public class N1037 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String s = scanner.next();
int len = s.length();
char[] ch = s.toCharArray();
int[] last = new int[1000];
long sum = 0;
for (int i = 1; i <= len; i++) {
sum += ((i - last[ch[i - 1]]) * (len - i + 1));
last[ch[i - 1]] = i;
}
System.out.println(sum);
}
}
说明:此代码并未AC,未发现其漏洞,如有发现错误请告知,谢谢!