Codeforces Round #455 (Div. 2)(A,B,C)

A. Generate Login
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

The preferred way to generate user login in Polygon is to concatenate a prefix of the user's first name and a prefix of their last name, in that order. Each prefix must be non-empty, and any of the prefixes can be the full name. Typically there are multiple possible logins for each person.

You are given the first and the last name of a user. Return the alphabetically earliest login they can get (regardless of other potential Polygon users).

As a reminder, a prefix of a string s is its substring which occurs at the beginning of s: "a", "ab", "abc" etc. are prefixes of string "{abcdef}" but "b" and 'bc" are not. A string a is alphabetically earlier than a string b, if a is a prefix of b, or a and b coincide up to some position, and then a has a letter that is alphabetically earlier than the corresponding letter in b: "a" and "ab" are alphabetically earlier than "ac" but "b" and "ba" are alphabetically later than "ac".

Input

The input consists of a single line containing two space-separated strings: the first and the last names. Each character of each string is a lowercase English letter. The length of each string is between 1 and 10, inclusive.

Output

Output a single string — alphabetically earliest possible login formed from these names. The output should be given in lowercase as well.

Examples
Input
harry potter
Output
hap
Input
tom riddle
Output
tomr

暴力一遍找到最小的前缀
 1 #include <iostream>
 2 #include <cstring>
 3 
 4 using namespace std;
 5 string s,ss;
 6 
 7 int k[26];
 8 int a[26];
 9 int main(){
10     cin>>s>>ss;
11     int slen = s.length();
12     int sslen = ss.length();
13     string s1="zzzzzzzzzz",s2;
14     for(int i=0;i<slen;i++){
15         for(int j=0;j<sslen;j++){
16             s2 = s.substr(0,i+1)+ss.substr(0,j+1);
17             s1 = min(s1,s2);
18             // cout<<s1<<" "<<s2<<" *** "<<endl;
19         }
20     }
21     cout<<s1<<endl;
22     return 0;
23 }

 

 

B. Segments
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

You are given an integer N. Consider all possible segments on the coordinate axis with endpoints at integer points with coordinates between 0 and N, inclusive; there will be of them.

You want to draw these segments in several layers so that in each layer the segments don't overlap (they might touch at the endpoints though). You can not move the segments to a different location on the coordinate axis.

Find the minimal number of layers you have to use for the given N.

Input

The only input line contains a single integer N (1 ≤ N ≤ 100).

Output

Output a single integer - the minimal number of layers required to draw the segments for the given N.

Examples
Input
2
Output
2
Input
3
Output
4
Input
4
Output
6
Note

As an example, here are the segments and their optimal arrangement into layers for N = 4.

 

其实只要两次循环并且自加,其实这种题应该是有公式直接套的。

(公式的话(n+1)/2*(n-(n+1)/2))

但是那样感觉没啥意思。

 1 #include <iostream>
 2 #include <cstring>
 3 #define N 105
 4 using namespace std;
 5 
 6 int vis[N];
 7 int n;
 8 int main(){
 9     while(cin>>n){
10         memset(vis,0,sizeof(vis));
11         for(int i=1;i<=n;i++){
12             for(int j=i;j<=n;j++){
13                 for(int l=i;l<=j;l++){
14                     vis[l]++;
15                 }
16             }
17         }
18         int cnt = 0;
19         for(int i=1;i<105;i++){
20             cnt = max(cnt,vis[i]);
21         }
22         cout<<cnt<<endl;
23     }
24     return 0;
25 }

 

 

C. Python Indentation
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

In Python, code blocks don't have explicit begin/end or curly braces to mark beginning and end of the block. Instead, code blocks are defined by indentation.

We will consider an extremely simplified subset of Python with only two types of statements.

Simple statements are written in a single line, one per line. An example of a simple statement is assignment.

For statements are compound statements: they contain one or several other statements. For statement consists of a header written in a separate line which starts with "for" prefix, and loop body. Loop body is a block of statements indented one level further than the header of the loop. Loop body can contain both types of statements. Loop body can't be empty.

You are given a sequence of statements without indentation. Find the number of ways in which the statements can be indented to form a valid Python program.

Input

The first line contains a single integer N (1 ≤ N ≤ 5000) — the number of commands in the program. N lines of the program follow, each line describing a single command. Each command is either "f" (denoting "for statement") or "s" ("simple statement"). It is guaranteed that the last line is a simple statement.

Output

Output one line containing an integer - the number of ways the given sequence of statements can be indented modulo 109 + 7.

Examples
Input
4
s
f
f
s
Output
1
Input
4
f
s
f
s
Output
2
Note

In the first test case, there is only one way to indent the program: the second for statement must be part of the body of the first one.


simple statement
for statement
for statement
simple statement

In the second test case, there are two ways to indent the program: the second for statement can either be part of the first one's body or a separate statement following the first one.


for statement
simple statement
for statement
simple statement

or


for statement
simple statement
for statement
simple statement

题意:python 里面,给出 n 个 for 循环或陈述语句,'f' 里面必须要有语句。按 python 缩进的方式组合成合法的程序,问有多少种可能方案。

tags: dp

dp[i][j] 表示第 i 个语句缩进为 j 时的可能方案数, 转移:

1】 如果第 i 个是 'f' , 则第 i+1 个肯定要比第 i 个多缩进一个单位,即 dp[i+1][j+1] = dp[i][j]。

2】如果第 i 个是  's' ,则第 i+1 个可以属于前面任何一个 for 循环,也就是说第 i+1 个的缩进要 <= 第 i 个的缩进,即 dp[i+1][j] = dp[i][k], j<=k<=n 。

复杂度 O(n^2)。

 1 #include <iostream>
 2 #include <cstring>
 3 #define N 5005
 4 typedef long long int ll;
 5 #define mod 1000000007
 6 using namespace std;
 7 int n;
 8 char c;
 9 ll dp[N][N];
10 int main(){
11     ios::sync_with_stdio(false);
12     cin.tie(0);
13     cin>>n;
14     memset(dp,0,sizeof(dp));
15     dp[1][0]=1;
16     for(int i = 1;i < n;i++){
17         cin>>c;
18         if(c == 'f'){
19             for(int j=0;j<=n;j++){
20                 dp[i+1][j+1] = dp[i][j];
21             }
22         }else{
23             ll sum = 0;
24             for(int j = n;j >= 0;j--){
25                 sum += dp[i][j];
26                 sum %= mod;
27                 dp[i+1][j] = sum;
28             }
29         }
30     }
31     cin>>c;
32     ll ans = 0;
33     for(int i=0;i<=n;i++){
34         ans += dp[n][i];
35         ans%=mod;
36     }
37     cout<<ans<<endl;
38     return 0;
39 }

 

转载于:https://www.cnblogs.com/zllwxm123/p/8135164.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值