JXUST&&ECJTU新生训练赛

A.

/**
 此题由于字符串的长度是10^5,所以利用O(n^2)暴力来做的话,
 显然是超时的,所以不采用这种方法,我们可以计算每个字符
 出现的次数,而题目中 告诉Pairs (x, y) and (y, x)
 should be considered different,所以组成的个数总和就是
 每个字符出现的次数的乘积之和。

*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include <string>
using namespace std;
typedef long long ll;
int main() {
    int num[300]= {0};
    string s;
    cin>>s;
    for(int i=0; i<s.size(); ++i)
        ++num[s[i]-'0'];
    ll ans=0;
    for(int i=0; i<300; ++i) {
        ans+=(ll)num[i]*num[i];
    }
    cout<<ans<<endl;
    return 0;
}

B.

/**
  这题是关于字符串的题目,主要注意的地方是输入问题,
  用string的话,cin输入遇到空格或者回车都会结束,
  所以必须用getline()来进行输入;如果对字符串的 
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
using namespace std;
string s;
int num[30];
int main() {
    int t,tcase;
    while(scanf("%d",&t)!=EOF) {
        tcase=0;
        getchar();
        while(t--) {
            memset(num,0,sizeof(num));
            getline(cin,s);
            for(int i=0; i<s.size(); i++) {
                if(s[i]==' ')continue;
                if(s[i]>='A'&&s[i]<='Z')++num[s[i]-'A'];
                else if(s[i]>='a'&&s[i]<='z')++num[s[i]-'a'];
            }
            getline(cin,s);
            for(int i=0; i<s.size(); i++) {
                if(s[i]==' ')continue;
                if(s[i]>='A'&&s[i]<='Z')--num[s[i]-'A'];
                else if(s[i]>='a'&&s[i]<='z')--num[s[i]-'a'];
            }
            int flag=0;
            for(int i=0; i<30; i++) {
                if(num[i]!=0) {
                    flag=1;
                    break;
                }
            }
            if(flag) {
                printf("Case %d: %s\n",++tcase,"No");
            } else {
                printf("Case %d: %s\n",++tcase,"Yes");
            }
        }
    }
    return 0;
}

C.

/**
  由题目知道luck number是4和7;所以我们可以
  采用以四个不同的字母为一个周期,这样他们的
  位置相减就会是4,这样就满足了题目要求的意思!
  但是因为题目要求是字典序最小,所以是按照abcd这
  四个字符组成一个周期。
  例如:abcdab
  a:1 5
  b:2 6
  c:3
  d:4
  因为a:5-1=4;b:6-2=4;
  所以采用周期为4!
*/
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int main() {
    int n;
    scanf("%d",&n);
    for(int i=0,j=0; i<n; ++i,++j) {
        if(j==4)j=0;
        printf("%c",'a'+j);
    }
    printf("\n");
    return 0;
}

D.

#include <cstdio>
#include <cmath>
#include <cstring>
using namespace std;
char com[15],data[105][55]= {"http://www.lightoj.com/"};
int For[105],Bac[105];
///模拟题,栈的应用
int main() {
    int T,tc = 0;
    scanf("%d",&T);
    while(T--) {
        int forward = 0,back = 0,cur = 0,cnt = 0;
        printf("Case %d:\n",++tc);
        while(scanf("%s",com) && strcmp(com,"QUIT")!=0) {
            if(strcmp(com,"VISIT") == 0) {
                scanf("%s",data[++cnt]);
                Bac[++back] = cur;
                cur = cnt;
                puts(data[cur]);
                forward = 0;
            }
            if(strcmp(com,"BACK") == 0) {
                if(back == 0)
                    puts("Ignored");
                else {
                    For[++forward] = cur;
                    cur = Bac[back--];
                    puts(data[cur]);
                }
            }
            if(strcmp(com,"FORWARD") == 0) {
                if(forward == 0)
                    puts("Ignored");
                else {
                    Bac[++back] = cur;
                    cur = For[forward--];
                    puts(data[cur]);
                }
            }
        }
    }
    return 0;
}

E.

#include <cstdio>
#include <cstring>
using namespace std;
const int N = 10005;
char s[N];
int main() {
    while(scanf("%s",s)!=EOF) {
        int idx = -1,sum = 0;
        int n = strlen(s);
        ///因为要求按字典序排列的下一个串,所以记录 能够把"("变")"的最后一个位置
        for(int i = 0; i < n; ++i) {
            if(s[i] == '(') {
                if(sum >= 1) idx = i;///前面有不少于1个未匹配的"(",当前这个位置可以把"("变成")"
                sum++;
            } else sum--;
        }
        if(idx == -1) printf("No solution\n");///没有找到,说明当前的括号串字典序最大
        else {
            s[idx]=')';///把最后一个可以变"("变成")"
            ///前面的部分已经确定,要使剩下的部分字典序最小,则凑成((()))的形式
            int x=n/2;
            for(int i = 0; i < n; ++i) {
                if(s[i] == '(') --x;
                if(i>idx)printf("%c",x>0?'(':')'),--x;
                else printf("%c",s[i]);
            }
            printf("\n");
        }
    }
    return 0;
}

F.

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
///模拟题
int G[105][105],g[105][105];
int main()
{
    int t,Case=0;
    scanf("%d",&t);
    while(t--)
    {
        memset(G,-1,sizeof(G));
        int n,m,q;
        scanf("%d%d%d",&n,&m,&q);
        while(q--)
        {
            int u,v;
            scanf("%d%d",&u,&v);
            ++u;
            int k=0;
            while(G[k+1][u]==-1&&k<n)++k;
            G[k][u]=v;
        }
        int p;
        scanf("%d",&p);
        while(p--)
        {
            int d;
            scanf("%d",&d);
            memset(g,-1,sizeof(g));
            if(d==90)
            {
                for(int i=m;i>=1;--i)
                    for(int j=1;j<=n;++j)
                    {
                        for(int j1=1;j1<=m;++j1)
                        if(G[j][j1]!=-1)
                        {
                            g[i][j]=G[j][j1];
                            G[j][j1]=-1;
                            break;
                        }
                    }
                swap(n,m);
            }
            else if(d==180)
            {
                for(int i=n;i>=1;--i)
                    for(int j=1;j<=m;++j)
                    {
                        for(int i1=1;i1<=n;++i1)
                        if(G[i1][m-j+1]!=-1)
                        {
                            g[i][j]=G[i1][m-j+1];
                            G[i1][m-j+1]=-1;
                            break;
                        }
                    }
            }
            else if(d==270)
            {
                for(int i=m;i>=1;--i)
                    for(int j=1;j<=n;++j)
                    {
                        for(int j1=m;j1>=1;--j1)
                        if(G[n-j+1][j1]!=-1)
                        {
                            g[i][j]=G[n-j+1][j1];
                            G[n-j+1][j1]=-1;
                            break;
                        }
                    }
                swap(n,m);
            }
            for(int i=1;i<=n;++i)
                for(int j=1;j<=m;++j)
                G[i][j]=g[i][j];
        }
        printf("%d.\n",++Case);
        for(int i=1;i<=n;++i)
        {
            for(int j=1;j<=m;++j)
                if(G[i][j]!=-1)printf("%d",G[i][j]);
                else printf(".");
            printf("\n");
        }
    }
    return 0;
}


你可能感兴趣的:(JXUST&&ECJTU新生训练赛)