[ACM] SDUT 2607 Mountain Subsequences
2015-04-07 20:21
204 查看
Mountain Subsequences
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
Coco is a beautiful ACMer girl living in a very beautiful mountain. There are many trees and flowers on the mountain, and there are many animals and birds also. Coco like the mountain so much that she now name some letter sequencesas Mountain Subsequences.
A Mountain Subsequence is defined as following:
1. If the length of the subsequence is n, there should be a max value letter, and the subsequence should like this, a1 < ...< ai < ai+1 < Amax > aj > aj+1 > ... > an
2. It should have at least 3 elements, and in the left of the max value letter there should have at least one element, the same as in the right.
3. The value of the letter is the ASCII value.
Given a letter sequence, Coco wants to know how many Mountain Subsequences exist.
输入
Input contains multiple test cases.For each case there is a number n (1<= n <= 100000) which means the length of the letter sequence in the first line, and the next line contains the letter sequence.
Please note that the letter sequence only contain lowercase letters.
输出
For each case please output the number of the mountain subsequences module 2012.示例输入
4abca
示例输出
4
提示
The 4 mountain subsequences are:aba, aca, bca, abca
来源
2013年山东省第四届ACM大学生程序设计竞赛示例程序
题意为给定长度为n的由小写字母组成的字符串,求有多少个字符串满足严格递增再递减。
比如 abca, 有 aba, aca , bca, abca ,四个符合题意的串。
注意acca,那么 aca ,aca算不同的串,因为c的下标不一样。
思路参考网上的。
#include <iostream> #include <stdio.h> #include <algorithm> #include <string.h> #include <cmath> #include <stdlib.h> #include <map> #include <vector> #include <set> #include <stack> #include <queue> #include <cctype> using namespace std; int n; const int maxn=100010; char s[maxn]; int dp[maxn];//dp[i]是以第i个字母结尾的递增子序列的个数(子序列的长度>=2) int has[27];//has[i]是以字母'a'+i结尾的递增子序列的个数(子序列的长度>=1,等于1的情况就是它本身) const int mod=2012; //对于dp数组,枚举每个位置作为最高峰, 从左到右求一遍,再从右到左求一遍, 则以该位置作为最高峰符合题意的串 //的个数为 dp[i]*dp[i’] , 最终答案为每个位置累加。 int main(int argc, char *argv[]) { while(scanf("%d",&n)!=EOF) { scanf("%s",s); long long ans=0; memset(has,0,sizeof(has)); for(int i=0;i<n;i++) { int id=s[i]-'a'; dp[i]=0; for(int j=0;j<id;j++) { dp[i]+=has[j]; dp[i]%=mod; } has[id]+=dp[i]+1; has[id]%=mod; } memset(has,0,sizeof(has)); long long sum;//相当于上头的dp数组。 for(int i=n-1;i>=0;i--) { int id=s[i]-'a'; sum=0; for(int j=0;j<id;j++) { sum+=has[j]; sum%=mod; } has[id]+=sum+1; has[id]%=mod; ans+=sum*dp[i]; ans%=mod; } cout<<ans<<endl; } return 0; }
相关文章推荐
- Java sdut acm 1131 CC++训练1---最大公约数与最小公倍数
- Java sdut acm 2178 链表的有序集合
- SDUT 2408 Pick apples(完全背包+贪心)2012年"浪潮杯"山东省第三届ACM大学生程序设计竞赛
- 山东省第一届ACM省赛 B SDUT 2152 Balloons(简单的BFS)
- ACM 第八届山东省赛 F quadratic equation SDUT 3898
- fireworks 2017年山东省ACM省赛C题 SDUT 3895 (逆元求组合数)
- SDUT 2879 Colorful Cupcakes (2014年山东省第五届ACM大学生程序设计竞赛)
- SDUT 2012春季ACM内部测试赛4's
- SDUTACM在线打字日常练习记录
- 山东省第一届ACM省赛 C SDUT 2153 Clockwise
- 山东省第四届ACM省赛 A SDUT 2603 Rescue The Princess(简单数学题)
- SDUTACM成绩评估
- [原]sdut2624 Contest Print Server (大水+大坑)山东省第四届ACM省赛
- sdut.acm 1188C语言实验——各位数字之和排序
- sdutacm-图的基本存储的基本方式三
- Java sdut acm 1959 简单枚举类型——植物与颜色
- Java sdut acm 2618 手机键盘
- Java-sdut-ACM 3870 判定Java源文件名称
- 计算长方形的周长和面积(类和对象)java sdut ACM 3339
- 山东省第一届ACM省赛 D SDUT 2154 Shopping