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; }
/** 这题是关于字符串的题目,主要注意的地方是输入问题, 用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; }
/** 由题目知道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; }
#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; }
#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; }
#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; }