列表

详情


NC220741. 这双是一道水题

描述

对于一个字符串 S,我们定义S 的分值 f(S)为S 中恰好出现一次的字符个数。例如f( "aba")=1,f("abc")=3, f("aaa")=0。
现在给定一个字符串 S[0,1,2,...,n-1](长度为 n),请你计算对于所有S 的非空子串S[i..j](0<=i<=j<n) ,f(S[i...j])的和是多少。

输入描述

输入一行包含一个由小写字母组成的字符串S。

输出描述

输出一个整数表示答案。

示例1

输入:

ababc

输出:

21

说明:

子串 f值

a     1

ab    2

aba   1

abab  0

ababc 1

 b    1

 ba   2

 bab  1

 babc 2

  a   1

  ab  2

  abc 3

   b  1

   bc 2

    c 1

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 4ms, 内存消耗: 800K, 提交时间: 2023-08-12 11:24:06

#include <bits/stdc++.h>
using namespace std;
string s;
int last[100005],nxt[100005];
int pos[26];
int main(){
    cin>>s;
    int n=s.size();
    for(int i=0;i<26;i++)pos[i]=-1;
    for(int i=0;i<n;i++){
        last[i]=pos[s[i]-'a'];
        pos[s[i]-'a']=i;
    }
    for(int i=0;i<26;i++)pos[i]=n;
    for(int i=n-1;i>=0;i--){
        nxt[i]=pos[s[i]-'a'];
        pos[s[i]-'a']=i;
    }
    long long ans=0;
    for(int i=0;i<n;i++){
        ans+=(i-last[i])*(nxt[i]-i);
    }
    cout<<ans<<endl;
    return 0;
}

Python3 解法, 执行用时: 420ms, 内存消耗: 25196K, 提交时间: 2023-08-12 11:23:44

A=[[0 for j in range(100010)]for i in range(26)] 
s=input().strip()
length=len(s)+1
for i in range(1,length):A[ord(s[i-1])-97][i]=1
for i in range(26):A[i][0]=A[i][length]=1
cnt=0
for i in range(26):
    head=mid=tail=0
    for j in range(1,length+1):
        if A[i][j]:
            if mid:
                tail=j
                cnt+=(tail-mid)*(mid-head)
                head=mid
                mid=tail
            else:
                mid=j
print(cnt)

上一题