テストの質問H:部分文字列スコアの合計
【問題の説明】
文字列Sの場合、Sのスコアf(S)をS内の異なる文字の数として定義します。
たとえば、f( "aba")= 2、f( "abc")= 3、f( "aaa")= 1です。文字列S [0..n-1](長さn)が与えられると、
Sのすべての空でない部分文字列について、S [i..j](0≤i≤j<n)、f(S [i..j])の合計を計算してください。
【入力フォーマット】
小文字のSで構成される文字列を含む行を入力します
[出力フォーマット]
答えを示す整数を出力します。
【サンプル入力】
ababc
【サンプル出力】
28
[サンプル概要]
子串 f值
a 1
ab 2
aba 2
abab 2
ababc 3
b 1
ba 2
bab 2
babc 3
a 1
ab 2
abc 3
b 1
bc 2
c 1
アイデア:
各部分文字列のスコアについては、最初に表示される文字のみが部分文字列に寄与します。たとえば、部分文字列「ababc」は文字abcに寄与します。次に、配列last [i]が文字iが最後に出現した位置を表すとすると、文字s [i]が寄与した部分文字列は、[last [i] + 1、i]と[i、n]で構成される部分文字列です。 ]、合計(i-last [i])*(n-i + 1)。
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
String str =cin.next();
int[] a = new int[30];
long ans = 0;
int n = str.length();
str = " " + str;
for(int i=1;i<=n;++i) {
ans+=(i-a[str.charAt(i)-'a'])*(long)1*(n-i+1);
a[str.charAt(i)-'a']=i;
}
System.out.println(ans);
}
}