leafee 拿到了一个只含有小写字母的字符串,她想知道有多少个 "abb" 型的子序列?
定义: abb 型字符串满足以下条件:
- 字符串长度为 3 。
- 字符串后两位相同。
- 字符串前两位不同。
leafee 拿到了一个只含有小写字母的字符串,她想知道有多少个 "abb" 型的子序列?
定义: abb 型字符串满足以下条件:
第一行一个正整数第二行一个长度为的字符串(只包含小写字母)
"abb" 型的子序列个数。
6 abcbcc
8
共有1个abb,3个acc,4个bcc
4 abbb
3
import math from collections import defaultdict def solution(n, string): # 初始化一个字典用于记录每个字符出现的次数 d = defaultdict(int) # 统计次数 for s in string: d[s] += 1 # 解的数量 num = 0 # 开始遍历 for s in string: # 每过一个字符,对应统计减一 d[s] -= 1 # 遍历,对于当前字符,与其他字符的排列组合数目即为潜在的abb序列数目 for e in d.keys(): if e != s: num += math.comb(d[e], 2) return num if __name__ == "__main__": while True: try: t = int(input()) string = input() print(solution(t, string)) except EOFError: break
#include<iostream> using namespace std; int num[128]={}; char str[100009]; long long Cn2(long long n){ return n*(n-1)/2; } int main(){ int n; cin>>n>>str; long long result=0; for(int i=n-1;i>=0;i--){ for(int j='a';j<='z';j++){ if(j!=str[i]){ result+=Cn2(num[j]); } } num[str[i]]++; } cout<<result<<endl; }
#include <iostream> #include <string> #include <vector> using namespace std; int main() { int n; cin >> n; string s; cin >> s; vector<long long> diff(n), same(n); vector<long long> cnt(26); for (int i = 0; i < n; i++) { diff[i] = i - cnt[s[i] - 'a']; cnt[s[i] - 'a']++; } cnt = vector<long long>(26, 0); for (int i = n - 1; i >= 0; i--){ same[i] = cnt[s[i] - 'a']; cnt[s[i] - 'a']++; } long long res = 0; for (int i = 0; i < n; i++) { res += diff[i] * same[i]; } cout << res << endl; return 0; } // 64 位输出请用 printf("%lld")9
n = int(input()) s = input() ans = 0 arr1, arr2 = [0]*26, [0]*26 for alpha in s[::-1]: index = ord(alpha) - 97 ans += sum(arr2) - arr2[index] arr2[index] += arr1[index] arr1[index] += 1 print(ans)
#include <stdio.h> int main() { int n; scanf("%d",&n); char c[n]; getchar(); scanf("%s",c); int sum[n+1][26]; for (int i=0; i<n+1; i++) { for (int j=0; j<26; j++) { sum[i][j]=0; } } // for (int i=0; i<n; i++) { // for (int j=i; j<n; j++) { // sum[i][c[j]-'a']++; // } // } for(int i=n-1;i>=0;i--){ for(int j=0;j<26;j++)sum[i][j]=sum[i+1][j]; sum[i][c[i]-'a']++; } long long r=0; for (int i=0; i<n; i++) { for (int j=0; j<26; j++) { if (j!=(c[i]-'a')) { r+=(sum[i][j]*(sum[i][j]-1)/2); } } } printf("%lld", r); return 0; }
#include <stdio.h> int main() { int n; scanf("%d",&n); char c[n]; getchar(); scanf("%s",c); int sum[n+1][26]; for (int i=0; i<n+1; i++) { for (int j=0; j<26; j++) { sum[i][j]=0; } } // for (int i=0; i<n; i++) { // for (int j=i; j<n; j++) { // sum[i][c[j]-'a']++; // } // } for(int i=n-1;i>=0;i--){ for(int j=0;j<26;j++)sum[i][j]=sum[i+1][j]; sum[i][c[i]-'a']++; } long long r=0; for (int i=0; i<n; i++) { for (int j=0; j<26; j++) { if (j!=(c[i]-'a')) { r+=(sum[i][j]*(sum[i][j]-1)/2); } } } printf("%lld", r); return 0; }
#include <bits/stdc++.h> using namespace std; #define LL long long int main() { int n; LL ans = 0; cin >> n; string s; cin >> s; unordered_map<char, long long> mp; for(auto &ch : s){ mp[ch]++; } for(auto &ch : s){ if(mp.count(ch)) mp[ch]--; if(mp[ch] == 0) mp.erase(ch); for(auto &pr : mp){ LL t = pr.second; if(pr.first != ch) ans += (t * (t-1)) / 2; } } cout << ans; }STL
#include <bits/stdc++.h> using namespace std; int main() { int n; cin>>n; string str; cin>>str; long long res=0; // 字母i 的出现个数 int a[26] = {0}; for(int i=n-1;i>=0;i--){ // a-z出现的次数 for(int j=0;j<26;j++){ if (j !=str[i] - 'a') { res += 1ll * a[j] * (a[j] - 1) / 2; } } a[str[i] - 'a'] ++; } cout << res << "\n"; } // 64 位输出请用 printf("%lld")
static void DP36() { Scanner in = new Scanner(System.in); int n = in.nextInt(); HashMap<Character, ArrayList<Integer>> map = new HashMap<>(); String s = in.next(); for (int i = 0; i < n; i++) { Character C = s.charAt(i); if (map.containsKey(C)) map.get(C).add(i); else { ArrayList<Integer> arr = new ArrayList<>(); arr.add(i); map.put(C, arr); } } long max = 0; for (char c = 'a'; c <= 'z'; c++) { max += getCountAbb(map, c); } System.out.println(max); } private static long getCountAbb(HashMap<Character, ArrayList<Integer>> map, Character C) { if (!map.containsKey(C) || map.get(C).size() == 1) return 0; ArrayList<Integer> arr = map.get(C); long max = 0; int n = arr.size(); for (int i = 0; i < n - 1; i++) { int index = arr.get(i); //字母所在的 位置. max += (long) (index - i) * (n - 1 - i); //前面字母的个数个数,除去已有的. 乘后面字母的数量 } return max; }
#include <iostream> #include <cstring> #include <algorithm> using namespace std; const int N = 100010; typedef long long LL; int n; char s[N]; int cnt[N][26]; int main() { scanf("%d", &n); scanf("%s", s + 1); for(int i = n; i >= 1; i --) { for(int j = 0; j < 26; j ++) cnt[i][j] = cnt[i + 1][j] + ((s[i] - 'a' == j) ? 1 : 0); } LL res = 0; for(int i = 1; i < n; i ++) { for(int j = 0; j < 26; j ++) { if(j != s[i] - 'a') { if(cnt[i + 1][j] >= 2) res += (cnt[i + 1][j]) * 1LL * (cnt[i + 1][j] - 1) / 2; } } } printf("%ld\n", res); return 0; }
import java.util.*; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); // 注意 hasNext 和 hasNextLine 的区别 while (in.hasNextInt()) { // 注意 while 处理多个 case int n = in.nextInt(); String str = in.next(); int[][] dp = new int[n + 1][26]; Arrays.fill(dp[n], 0); for (int i = n - 1; i >= 1; i--) { char ch = str.charAt(i); for (int j = 0; j < 26; j++) { if (ch - 'a' == j) { dp[i][j] = dp[i + 1][j] + 1; } else { dp[i][j] = dp[i + 1][j]; } } } long res = 0; for (int i = 1; i <= n; i++) { char c = str.charAt(i - 1); for (int j = 0; j < 26; j++) { if (c - 'a' != j && dp[i][j] >= 2) { res += dp[i][j] * (dp[i][j] - 1) / 2; } } } System.out.println(res); } } }