加载中...

子串分值和

子串分值和 - 蓝桥云课 (lanqiao.cn)

分析:

  1. 考虑每个字符在多少种子串中有价值,即在多少种子串中时第一次出现,第一次出现可能出现在任何位置(开头,中间,最后)
  2. 用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,未发现其漏洞,如有发现错误请告知,谢谢!

posted @ 2023-03-21 21:16  ChuenSan  阅读(30)  评论(0编辑  收藏  举报