子串分值和
分析:
- 考虑每个字符在多少种子串中有价值,即在多少种子串中时第一次出现,第一次出现可能出现在任何位置(开头,中间,最后)
- 用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,未发现其漏洞,如有发现错误请告知,谢谢!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】