【问题描述】
对于一个字符串 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
一、暴力枚举
#include
using namespace std;
int main(){
string c;
cin>>c;
int len=c.length();
int sum=len;
int str[26];
int s[26];
for(int i=0;i<26;i++){
s[i]=0;
}
str[0]=97;
for(int i=1;i<26;i++){
str[i]=str[i-1]+1;
}
for(int n=2;n<=len;n++){
for(int i=0;i<=len-n;i++){
string ch=c.substr(i,n);
for(int j=0;j0){
sum+=1;
s[p]=0;
}
}
}
}
cout<
二、使用set去掉重复元素
#include
using namespace std;
int cal(string s){
set st;
for(int i=0;i>str;
int len = str.length();
for(int i=1;i<=len;i++){
for(int j=0;j<=len-i;j++){
string s=str.substr(j,i);
sum+=cal(s);
}
}
cout<
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)