子串分值
能过50%
#include<iostream>
#include<cstring>
using namespace std;
int alpha[26];
string s;
int check(int i,int j)
{
memset(alpha,0,sizeof alpha);
for(int k=i;k<=j;k++)
alpha[s[k]-'a']++;
int ret = 0;
for(int k=0;k<26;k++)
if(alpha[k]==1)
ret++;
return ret;
}
int main()
{
int cnt = 0;
cin >> s;
for(int i=0;i<s.size();i++)
{
for(int j=i;j<s.size();j++)
{
cnt = cnt + check(i,j);
}
}
cout << cnt << endl;
return 0;
}
能过60%,把check删了,我再观察观察
#include<iostream>
#include<cstring>
using namespace std;
int alpha[26];
int vis[26];
string s;
int main()
{
int cnt = 0;
cin >> s;
for(int i=0;i<s.size();i++)
{
memset(vis,0,sizeof vis);
int f = 0;
for(int j=i;j<s.size();j++)
{
if(vis[s[j]-'a']==0) {f++; vis[s[j]-'a']++;}
else if(vis[s[j]-'a']==1) {f--; vis[s[j]-'a']++;}
cnt = cnt + f;
}
}
cout << cnt << endl;
return 0;
}
能过全部数据
#include<iostream>
#include<cstring>
using namespace std;
const int maxN = 1e5+10;
int l[maxN], r[maxN], p[26];
char s[maxN];
int n;
long long ans;
int main()
{
scanf("%s",s+1);
n = strlen(s+1);
for(int i=1;i<=n;i++)
{
int ch = s[i] - 'a';
l[i] = p[ch];
p[ch] = i;
}
for(int i=0;i<26;i++) p[i] = n+1;
for(int i=n;i>0;i--)
{
int ch = s[i] - 'a';
r[i] = p[ch];
p[ch] = i;
}
for(int i=1;i<=n;i++)
ans += (long long)(i-l[i])*(r[i]-i);
cout << ans << endl;
return 0;
}
分析:
算每个字符的贡献,纯思路题,看别人的解答得出。
没做出来原因:
想不到啊