子串分值

文章讲述了如何通过C++代码实现子串分值的计算,从最初的`check`函数到优化后的`vis`数组,最后到使用`l[]`和`r[]`数组来高效分析每个字符的贡献,解决纯思路问题。作者分享了解答过程中的思考和未解决问题的原因。
摘要由CSDN通过智能技术生成

子串分值

能过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;

}

分析:
算每个字符的贡献,纯思路题,看别人的解答得出。

没做出来原因:
想不到啊

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值