ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

CUIT2019新生赛补题

2021-01-01 23:03:45  阅读:158  来源: 互联网

标签:CUIT2019 int 新生 补题 Output 字符串 Input include size


A - 相等的String

给你一个长度为n,只包含小写字母的字符串t,在给你一个整数k。

一个字符串s的子串s[l,r]表示下标从l开始到r的所有字符集。

你的任务是构造一个字符串s使得有k个不同的位置i满足s[i, n+i-1] = t。换句话说你的任务是构造长度最小的字符串s满足恰好有k个不同的子串等于t。

Input

第一行包含两个数n 和 k (1 <= n, k<= 50) 分别代表字符串t的长度 以及出现的次数k.

第二行包含长度为n的小写字母字符串t.

Output

输出长度最小的字符串s,满足恰好有k个不同的子串等于t。

Examples

Input

3 4
aba

Output

ababababa

Input

3 2
cat

Output

catcat

Code:

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;

const int N = 55;
char p[N];
int ne[N];
int main()
{
    int n, k;
    cin >> n >> k >> p+1;
    string sn;
    for(int i = 2, j = 0;i <= n;i++)
    {
        while(j && p[i]!=p[j+1])j = ne[j];
        if(p[i] == p[j+1])j++;
        ne[i] = j;
    }
    sn = p+1;
    string ans = sn.substr(ne[n]);
    for(int i = 0;i < k-1;i++)
    {
        sn+=ans;
    }
    cout << sn <<endl;
    return 0;
}

B - 数组游戏

hannibal有一个长度为n的整数数组。

他想在数组上玩个游戏。 游戏由几步组成。 第一步,他选择任一元素并将其删除(第一步之后,数组包含n−1个元素)。 对于接下来的每个操作,他都在限定规则下选择任一元素:其奇偶性应该不同于在上一个操作中删除的元素的奇偶性。 换句话说,他交替删除元素的奇偶性应该是(奇偶奇…或偶奇偶…)。 如果他不能采取行动,hannibal就会停下来。

hannibal的目标是在游戏结束后最大程度地减少数组中未删除元素的总和。 如果hannibal可以删除整个数组,则未删除元素的总和为零。 帮助hannibal找到该最小值。

Input

第一行输入一个整数n (1 <= n <= 2000)代表数组a的长度

第二行输入n个数,分别代表 a[1], a[2], a[3]…. a[n] (0 <= a[i] <= 1000000).

Output

输出一个数代表最小的未删除元素的总和

Examples

Input

5
1 5 7 8 2

Output

0

Input

6
5 1 2 4 6 3

Output

0

Input

2
1000000 1000000

Output

1000000

Code:

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

const int N = 2005;

int a[N];
vector<int>odd, even;

int main()
{
    int n;
    scanf("%d",&n);
    for(int i = 0; i < n; i++)
    {
        scanf("%d",&a[i]);
        if(a[i]%2==0)even.push_back(a[i]);
        else odd.push_back(a[i]);
    }
    sort(odd.begin(),odd.end());
    sort(even.begin(), even.end());
    int ans = 0;
    if(odd.size() == even.size() || odd.size()-even.size() == 1||even.size()-odd.size()==1)printf("0\n");
    else{
        if(odd.size() > even.size())
        {
            for(int i = 0;i < odd.size()-even.size()-1;i++)ans+=odd[i];
        }
        else
        {
            for(int i = 0;i < even.size()-odd.size()-1;i++)ans+=even[i];
        }
        printf("%d\n",ans);
    }
    return 0;
}

C - 好串

定义一个字符串是好的当且仅当它的长度是偶数,并且该字符串的奇数位置中的每个字符都与下一个字符不同(第一个字符与第二个字符不同,第三个字符与第四个字符不同) ,依此类推)。 例如,字符串good,string和xyyx是好的字符串,而字符串bad,aa和aabc则不好。 请注意,空字符串被认为是很好的。 给你一个字符串 s ,你必须从该字符串中删除最少的字符数,这样它才能变成好的字符串。

Input

一个行输入一个数n (1 <= n <= 200000) 代表字符串s的数量.

第二行代表字符串 s,n 个小写字母.

Output

第一行输出一个数 k (0 <= k <= n) 代表从s中要删除的最少的字符数量

第二行输出删除后的字符串 s. 如果为空,你可以输出一个空字符串或者什么都不输出.

Examples

Input

4
good

Output

0
good

Input

4
aabc

Output

2
ab

Input

3
aaa

Output

3

D - 小A和plmm

在平面直角坐标系上,小A遇见了一个plmm。

小A站在坐标点(0,0),plmm在点(x,y)(0≤x≤1010,0≤y≤1010)处。因为小A太想见到plmm了,所以他每次只会向上走(x,y)→(x+1,y)或向右走(x,y)→(x,y+1)。

小A有很多种路径找到plmm的位置,但是他想知道到达plmm位置的路径长度的期望是多少。你能够帮帮他吗?

Input

单组输入,每次给出plmm的位置x和y(0≤x≤1010,0≤y≤1010)。

Output

输出到达plmm位置的路径长度的期望。
你的输出应该与答案的误差在10−6以内。例如你的答案是a,如果|a−ans|≤10−6,你的答案都是可以接受的!

Examples

Input

1 2

Output

3.00000000

Input

1 10

Output

11.00000000

Note

'到达plmm位置的路径长度的期望'也就是所有能够到达(x,y)的路径的长度的平均值。
Code:

#include <iostream>
using namespace std;

int main()
{
    long long a,b;
    scanf("%lld%lld",&a,&b);
    printf("%lld",a+b);
    return 0;
}

E - 线段树模板

凡凡说自己可以随便进队,然后旭旭说我出一道题考考你。凡凡说,这不是线段树裸题吗,凡凡都懒得写了,他把题目对给了你,相信你会很轻松的敲出这个水的线段树模板题。

给一个长度为n的序列a(−10000≤ai≤10000)。 你需要进行q(1≤q≤1000)次操作。

每次操作需要维护/查询以下功能:

'1 i v':修改第i个数ai为v(−10000≤v≤10000)。例如序列{1,2,3,4,5,6},修改第2个数为7,修改后的序列为{1,7,3,4,5,6}。
'2 l r v':修改区间[l,r]的数为v(−10000≤v≤10000)。例如序列{1,2,3,4,5,6},修改区间[2,5]为7,修改后的序列为{1,7,7,7,7,6}。
'3 l r':查询区间[l,r]的和。例如序列{1,2,3,4,5,6},查询区间[2,5]和,答案应该是'14'。因为2+3+4+5=14。
'4 l r v':区间[l,r]加上v(−10000≤v≤10000)。例如序列{1,2,3,4,5,6},区间[2,5]加上2,修改后的序列为{1,4,5,6,7,6}。
'5 l r':查询区间[l,r]平方和。例如序列{1,2,3,4,5,6}查询区间[2,4]的平方和,答案应该是'29'。因为22+32+42=29。
'6 l r':查询区间[l,r]立方和。例如序列{1,2,3,4,5,6}查询区间[2,4]的立方和,答案应该是'99'。因为23+33+43=99。
'7 l r':对区间[l,r]镜面翻转。例如序列{1,2,3,4,5,6},将区间[2,5]翻转后得到序列{1,5,4,3,2,6}。
'8 l r':查询区间[l,r]中的的最大值。例如序列{1,2,3,4,5,6},查询区间[2,5]最大值,答案应该是'5'。
'9 l r':查询区间[l,r]中的的最小值。例如序列{1,2,3,4,5,6},查询区间[2,5]最小值,答案应该是'2'。

Input

第一行,为序列长度n(1≤n≤1000)。

第二行,为n个数,第i个数代表ai(−10000≤ai≤10000)。

第三行,为操作的次数q(1≤ q≤1000)。

第4至(q+3)行,为要进行的操作。对每种操作,输入格式如上所述,第一个数为操作的id(1≤id≤9),随后是操作对应的数据。

Output

对于每个查询操作输出一行要查询的答案。

Example

Input
6
1 2 3 4 5 6
9
1 1 7
2 1 3 1
3 1 3
4 1 3 2
5 1 6
6 1 6
7 2 5
8 1 5
9 1 6
Output
3
104
486
5
3

code:
错因: 1.求前缀和的时候放在输入数组的时候求,应该放在对应的维护操作上求前缀和,因为其他操作会影响原数组的值
2.求平方和和立方和需要long long sum和1ll*(十分重要)
3.镜面反转出错,未检验其他数据。
4.求最大值的时候,定义maxx = INT_MIN,错因,定义为0,题目有负数

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

const int N = 20005;
int a[N];
int c[N];
int s[N];
int temp[N];
int main()
{
    int n, q;
    scanf("%d",&n);
    for(int i = 1;i <= n;i++)
    {
        scanf("%d",&a[i]);
        s[i] = a[i]+s[i-1];
    }
    scanf("%d", &q);
    while(q--)
    {
        int k,l,r,v;
        scanf("%d",&k);
        if(k == 1)
        {
            scanf("%d%d",&l,&r);
            a[l] = r;
        }
        else if (k == 4)
        {
            scanf("%d%d%d",&l,&r,&v);
            for(int i = 1; i <= n;i++)c[i] = a[i]-a[i-1];
            c[l]+=v;
            c[r+1]-=v;
            for(int i = 1; i <= n;i++)
            {
                c[i] = c[i-1]+c[i];
                a[i] = c[i];
            }
        }
        else if(k == 3)
        {
            scanf("%d%d",&l,&r);
            for(int i = 1;i <= n;i++)
                s[i] = s[i-1]+a[i];
            printf("%d\n",s[r]-s[l-1]);
        }
        else if(k == 2)
        {
            scanf("%d%d%d",&l,&r,&v);
            for(int i = l;i <= r;i++)a[i] = v;
        }
        else if(k == 5)
        {
            scanf("%d%d",&l,&r);
            long long sum = 0;
            for(int i = l;i <= r;i++)sum+=1ll*a[i]*a[i];
            printf("%lld\n",sum);
        }
        else if(k == 6)
        {
            scanf("%d%d",&l,&r);
            long long sum = 0;
            for(int i = l;i <= r;i++)sum+=1ll*a[i]*a[i]*a[i];
            printf("%lld\n",sum);
        }
        else if(k == 7)
        {
            int p = 0;
            scanf("%d%d",&l,&r);
            for(int i = l; i <= r; i++)temp[p++] = a[i];
            p = 0;
            for(int i = r; i >= l; i--)a[i] = temp[p++];
        }
        else if(k == 8)
        {
            scanf("%d%d",&l,&r);
            int maxx = INT_MIN;
            for(int i = l; i <= r; i++)maxx = max(maxx,a[i]);
            printf("%d\n",maxx);
        }
        else if (k == 9)
        {
            scanf("%d%d",&l, &r);
            int minn = 0x3f3f3f3f;
            for(int i = l; i <= r;i++)minn = min(minn,a[i]);
            printf("%d\n",minn);
        }
    }
    return 0;
}

F - 扫雷游戏

小A喜欢树,现在他在一个x * y 的网格中
他想统计一下每个格子周围有多少棵树
周围指的是上,下,左,右,左上,右上,左下,右下。

输入格式

第一行包含两个整数 x 和 y,分别表示网格的行数和列数。1≤x≤100,1≤y≤100。
接下来 x 行,每行 y 个字符,'*'表示相应格子中是一棵树,'?'表示相应格子什么都没有。字符之间无任何分隔符。

输出格式

输出x行y列,描述整个网格。若相应格中是棵树,则用'*'表示,否则用相应的周围格树的棵数表示。字符之间无任何分隔符。

输出时每行末尾的多余空格,不影响答案正确性

样例输入
3 3
*??
???
?**
样例输出
*10
232
1**

Code:

#include<bits/stdc++.h>
using namespace std;
char a[1000][1000];
char b[200005];
int main()
{
    int x,y;
    cin>>x>>y;
    getchar();
    for(int i = 1;i <= x;++i)
    {
        for(int j = 1;j <= y;++j)
        {
            scanf("%c",&a[i][j]);
        }
        getchar();
    }
    for(int i = 1;i <= x;++i)
    {
        for(int j = 1;j <= y;++j)
        {
            if(a[i][j] == '?')
                a[i][j]='0';
        }
    }
    for(int i = 1;i <= x;++i)
    {
        for(int j = 1;j <= y;++j)
        {
            if(a[i][j] == '*')
            {
                if(a[i+1][j]!='*')
                a[i+1][j]+=1;
                if(a[i+1][j+1]!='*')
                a[i+1][j+1]+=1;
                if(a[i+1][j-1]!='*')
                a[i+1][j-1]+=1;
                if(a[i-1][j]!='*')
                a[i-1][j]+=1;
                if(a[i-1][j-1]!='*')
                a[i-1][j-1]+=1;
                if(a[i-1][j+1]!='*')
                a[i-1][j+1]+=1;
                if(a[i][j+1]!='*')
                a[i][j+1]+=1;
                if(a[i][j-1]!='*')
                a[i][j-1]+=1;
            }
        }
    }
    for(int i = 1;i <= x;++i)
    {
        for(int j = 1;j <= y;++j)
        {
            printf("%c",a[i][j]);
        }
        printf("\n");
    }
    return 0;
}

K - 真正的签到题
给你一个n大小的数列,要求输出奇数位置的和与偶数位置的和。

Input

输入一个整数n. 然后接下来n个数。 1=<n<=106.每个数大小1<=x<=103

Output

输出2个整数,分别输出偶数位置的和与奇数位置的和。

Examples

Input
3
12 3 45
Output
3 57
Input
5
1 2 3 4 5
Output
6 9

code:

#include<bits/stdc++.h>
using namespace std;
int a[1000005];
int main()
{
    int n,ou = 0,ji = 0;
    cin>>n;
    for(int i = 1;i <= n;++i )
    {
        cin>>a[i];
    }
    for(int i = 1;i <= n;++i)
    {
        if(i % 2 == 0)ou+=a[i];
        if(i%2!=0)ji+=a[i];
    }
    cout<<ou<<" "<<ji<<endl;
    return 0;
}

标签:CUIT2019,int,新生,补题,Output,字符串,Input,include,size
来源: https://www.cnblogs.com/wr1sw/p/14221163.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有