暴力 O(n^3) 过60%
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 10010;
char arr[N];
int sw[N];
int main()
{
scanf("%s", arr + 1);
int n = strlen(arr+1);
int res = 0;
//枚举每一个子集
for(int i = 1 ; i <= n ; i++)
{
for(int j = i ; j <= n ; j++)
{
int ans = 0;
memset(sw , 0 , sizeof sw);
//遍历每个子集
for(int k = i ; k <= j ; k++)
{
sw[arr[k]-'a'+1] ++;
}
//在每个子集的情况下,计算字符种数
for(char r = 'a' ; r <= 'z'; r++)
{
if(sw[r-'a'+1] != 0) ans++;
}
res += ans;
}
}
printf("%d", res);
return 0;
}
优化
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 100010;
char arr[N];
int s[30];//记录上一个字符出现的位置
long long ans = 0;
int main()
{
scanf("%s", arr + 1);
long long n = strlen(arr+1);
for(int i = 1 ; i <= n ; i++)
{
int t = arr[i] - 'a' + 1;
ans += (i - s[t]) * (n - i + 1);//这个好难发现,
s[t] = i;
}
cout<<ans;
return 0;
}
孙少平筒着双手走在清冷的街道上,内心突然涌起一种火辣辣的情绪。他问自己:你难道一辈子就这样生活下去吗?你最后的归宿在哪里?
——《平凡的世界》