题目链接:http://codeforces.com/contest/1307/problem/C
题意:给你一个字符串,让你求出该字符串的出现最多次的子序列的次数,且子序列的每个序号要是等差数列。
思路:因为子序列的每个序号要是等差数列,所以只要考虑只有一个和两个的子序列,一个的话就是出现最多的字符次数,两个的话可以先预处理下,然后再枚举所有的两个的子序列, 就可以了。
#include<stdio.h> #include<iostream> #include<string.h> #include<math.h> #include<string> #include<algorithm> #include<queue> #include<map> typedef long long ll; using namespace std; char a[200005]; ll b[200005][30]; int main() { scanf("%s",a+1); ll n=strlen(a+1); for(int i=1;i<=n;i++) { int x=a[i]-'a'; for(int j=0;j<26;j++) b[i][j]=b[i-1][j]; b[i][x]++; } ll ma=0; for(int i=0;i<26;i++) ma=max(ma,b[n][i]); ll ans=ma; ans=max(ans,ma*(ma-1)/2); for(int i=0;i<26;i++) for(int j=0;j<26;j++) { if(i==j) continue; ll sum=0; for(int k=n;k>=1;k--) { if(a[k]==j+'a') sum=sum+b[k-1][i]; } ans=max(ans,sum); } printf("%lld ",ans); }