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;
}