DP36. abb
描述
leafee 最近爱上了 abb 型语句,比如“叠词词”、“恶心心” leafee 拿到了一个只含有小写字母的字符串,她想知道有多少个 "abb" 型的子序列?
定义: abb 型字符串满足以下条件:
输入描述
输出描述
"abb" 型的子序列个数。示例1
输入:
6 abcbcc
输出:
8
说明:
示例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); }