列表

详情


DP36. abb

描述

leafee 最近爱上了 abb 型语句,比如“叠词词”、“恶心心”

leafee 拿到了一个只含有小写字母的字符串,她想知道有多少个 "abb" 型的子序列?
定义: abb 型字符串满足以下条件:

  1. 字符串长度为 3 。
  2. 字符串后两位相同。
  3. 字符串前两位不同。

输入描述

第一行一个正整数 
第二行一个长度为 的字符串(只包含小写字母)

输出描述

"abb" 型的子序列个数。

示例1

输入:

6
abcbcc

输出:

8

说明:

共有1个abb,3个acc,4个bcc

示例2

输入:

4
abbb

输出:

3

原站题解

C 解法, 执行用时: 3ms, 内存消耗: 328KB, 提交时间: 2022-03-23

#include <stdio.h>
#include <assert.h>
int main(void)
{
    int n;
    while(scanf("%d", &n) != EOF)
    {
        assert(n>0 && n<=100000);   getchar();
        
        long long dp[128] = {0}, cnt[128] = {0}, sum = 0;
        char ch;   int idx = 0;
        while((ch = getchar())!='\n' && idx<n)
        {
            assert(ch>='a' && ch<='z');
            sum += dp[ch];
            dp[ch] += idx++ - cnt[ch]++;
        }
        assert(ch=='\n' && idx==n);
        printf("%lld\n", sum);
    }
    return 0;
}

C 解法, 执行用时: 3ms, 内存消耗: 460KB, 提交时间: 2021-11-28

#include<stdio.h>

int main()
{
    long long n,res=0;
    long long cnt[26]={0},dp[26]={0};
    scanf("%lld",&n);
    getchar();
    char *s=(char*)malloc(n+1);
    gets(s);
    
    for(int i=0;i<n;++i)
    {
        res+=dp[s[i]-'a'];
        dp[s[i]-'a']+=i-cnt[s[i]-'a'];
        ++cnt[s[i]-'a'];
    }
    
    printf("%lld",res);
    free(s);
    return 0;
}

C 解法, 执行用时: 3ms, 内存消耗: 468KB, 提交时间: 2022-03-16

#include<stdio.h>
#include<string.h>
int main()
{
  long long n,res=0;
  long long cnt[30]={0},dp[30]={0};
  scanf("%lld",&n);
  getchar();
  char *s=(char *)malloc(n+1);
  gets(s);
    
  for(int i=0;i<n;++i)
  {
    res+=dp[s[i]-'a'];
    dp[s[i]-'a']+=i-cnt[s[i]-'a'];
    ++cnt[s[i]-'a'];
  }
  printf("%lld",res);
  free(s);
  return 0;
}

C 解法, 执行用时: 3ms, 内存消耗: 472KB, 提交时间: 2022-02-10

#include<stdio.h>
int main(){
    long long n,res=0;
    long long cnt[26]={0},dp[26]={0};
    scanf("%lld",&n);
    getchar();
    char *s=(char*)malloc(n+1);
    gets(s);
    for(int i=0;i<n;i++){
        res+=dp[s[i]-'a'];
        dp[s[i]-'a']+=i-cnt[s[i]-'a'];
        ++cnt[s[i]-'a'];
    }
    printf("%lld",res);
    free(s);
    return 0;
}

C++ 解法, 执行用时: 3ms, 内存消耗: 544KB, 提交时间: 2021-12-21

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN=1e5+5;
int cnt[30];
ll dp[MAXN];
char s[MAXN];
int main()
{
    int n;
    scanf("%d",&n);
    scanf("%s",s+1);
    ll sum=0;
    assert(n<=1e5);
    for(int i=1;i<=n;i++)
    {
        int& num=cnt[s[i]-'a'];
        int tot=i-1-num;
        sum+=dp[s[i]-'a'];
        dp[s[i]-'a']+=tot;
        num++;
    }
    printf("%lld\n",sum);
}

上一题