前九题
总时间限制:
1000ms
内存限制:
65536kB
描述
输入一行字符,统计出其中数字字符的个数。
输入
一行字符串,总长度不超过255。
输出
输出为1行,输出字符串里面数字字符的个数。
样例输入
Peking University is set up at 1898.
样例输出
4
来源
习题(7-1) 医学部 2010 期末试题 樊波
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>using namespace std;char a[10000];int main()
{
int sum=0;
gets(a);
int l=strlen(a);
for(int i=0;i<l;i++)
{
if(a[i]>=‘0‘&&a[i]<=‘9‘)
sum++;
}
printf("%d",sum);
return 0;
}
总时间限制:
1000ms
内存限制:
65536kB
描述
给定一个只包含小写字母的字符串,请你找到第一个仅出现一次的字符。如果没有,输出no。
输入
一个字符串,长度小于100000。
输出
输出第一个仅出现一次的字符,若没有则输出no。
样例输入
abcabd
样例输出
c
#include<iostream>
#include<cstdio>
#include<cstring>using namespace std;char a[100001],b[300];int c[25];int main()
{
gets(a);
int l=strlen(a);
for(int i=0;i<l;i++)
b[a[i]]++;
for(int i=0;i<l;i++)
if(b[a[i]]==1)
{
printf("%c",a[i]);
return 0;
}
printf("no");
return 0;
}
总时间限制:
1000ms
内存限制:
65536kB
描述
为了获知基因序列在功能和结构上的相似性,经常需要将几条不同序列的DNA进行比对,以判断该比对的DNA是否具有相关性。
现比对两条长度相同的DNA序列。首先定义两条DNA序列相同位置的碱基为一个碱基对,如果一个碱基对中的两个碱基相同的话,则称为相同碱基对。接着计算相同碱基对占总碱基对数量的比例,如果该比例大于等于给定阈值时则判定该两条DNA序列是相关的,否则不相关。
输入
有三行,第一行是用来判定出两条DNA序列是否相关的阈值,随后2行是两条DNA序列(长度不大于500)。
输出
若两条DNA序列相关,则输出“yes”,否则输出“no”。
样例输入
0.85
ATCGCCGTAAGTAACGGTTTTAAATAGGCC
ATCGCCGGAAGTAACGGTCTTAAATAGGCC
样例输出
yes
#include<cstdio>
#include<string>
#include<iostream>using namespace std;int main()
{
double a;
scanf("%lf",&a);
int i,p=0,len;
double m;
string s1,s2;
cin>>s1;
cin>>s2;
int l1=s1.length(),l2=s2.length();
if(l1>12) len=l1;
else len=l2;
for(i=0; i<len; i++)
{
if(s1[i]==s2[i])
{
p++;
}
}
m=1.0*p/len;
if(m>=a) cout<<"yes"<<endl;
else cout<<"no"<<endl;
return 0;
}
总时间限制:
1000ms
内存限制:
65536kB
描述
石头剪子布,是一种猜拳游戏。起源于中国,然后传到日本、朝鲜等地,随着亚欧贸易的不断发展它传到了欧洲,到了近现代逐渐风靡世界。简单明了的规则,使得石头剪子布没有任何规则漏洞可钻,单次玩法比拼运气,多回合玩法比拼心理博弈,使得石头剪子布这个古老的游戏同时用于“意外”与“技术”两种特性,深受世界人民喜爱。
游戏规则:石头打剪刀,布包石头,剪刀剪布。
现在,需要你写一个程序来判断石头剪子布游戏的结果。
输入
输入包括N+1行:
第一行是一个整数N,表示一共进行了N次游戏。1 <= N <= 100。
接下来N行的每一行包括两个字符串,表示游戏参与者Player1,Player2的选择(石头、剪子或者是布):
S1 S2
字符串之间以空格隔开S1,S2只可能取值在{"Rock", "Scissors", "Paper"}(大小写敏感)中。
输出
输出包括N行,每一行对应一个胜利者(Player1或者Player2),或者游戏出现平局,则输出Tie。
样例输入
3
Rock Scissors
Paper Paper
Rock Paper
样例输出
Player1
Tie
Player2
提示
Rock是石头,Scissors是剪刀,Paper是布。混混谔谔
#include<cstdio>
#include<string>
#include<iostream>using namespace std;int main()
{
int n;
cin>>n;
char a[500],b[500];
for(int i=0;i<n;i++)
{
cin>>a>>b;
if(a[0]==‘R‘&&b[0]==‘S‘||a[0]==‘S‘&&b[0]==‘P‘||a[0]==‘P‘&&b[0]==‘R‘) cout<<"Player1"<<endl;
else
if(a[0]==b[0]) cout<<"Tie"<<endl;
else cout<<"Player2"<<endl;
}
return 0;
}
#include<stdio.h>
#include<string.h>
char a[500],b[500];
int main()
{
int x,y,n;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%s %s",a,b);
if(a[0]==‘R‘ && b[0]==‘S‘) printf("Player1\n");
if(a[0]==‘S‘ && b[0]==‘P‘) printf("Player1\n");
if(a[0]==‘P‘ && b[0]==‘R‘) printf("Player1\n");
if(b[0]==‘R‘ && a[0]==‘S‘) printf("Player2\n");
if(b[0]==‘S‘ && a[0]==‘P‘) printf("Player2\n");
if(b[0]==‘P‘ && a[0]==‘R‘) printf("Player2\n");
if(a[0]==b[0]) printf("Tie\n");
}
return 0;
}
哈希
哈希例题1
枚举循环节长度L
用哈希判断A[1…L],A[L+1…2L],A[2L+1…3L]……是否相等
最后一个循环节长度可能不足L,特殊判断
代码实现
//哈希例题1
#include <cstdio>
#include <cstring>
#define e 29LL
#define mo 1000000007
#define N 100010
//定义常量
char s[N];
long long hash[N],hs,el;
int n,i,L;
bool flg;
int main()
{
scanf("%s", s+1);//下标是0到n-1;
n = strlen(s+1);
for (i=1; i<=n; ++i)
{ hash[i] = (hash[i-1]*e+(s[i]-‘a‘+1))%mo;
}
el = 1;
for (L=1; L<=n; ++L)
{
el = el*e%mo;
flg = true;
for (i=L+1; i<n/L*L+1; i+=L)
{
hs = (hash[i+L-1]-hash[i-1]*el%mo+mo)%mo;
if (hs != hash[L])
{
flg = false;
break;
}
}
if (flg)
{
for (i=n/L*L+1; i<=n; ++i)
if (s[i] != s[i-n/L*L])
{
flg = false;
break;
}
if (flg)
{
printf("%d\n", L);
break;
}
}
}
}
哈希例题2
在O(n)时间内,计算出一个字符串以每个位置为中心(一个字符或者字符间隙)最长能扩展出多长的回文串
代码实现
//哈希例题2
#include <cstdio>
#include <cstring>
#define N 100011
#define e 29
#define mo 1000000007
char s[N];
long long hs1[N],hs2[N],a[N],HS1,HS2,pow[N];
int i,n,m,l,r,mid;
int main()
{
scanf("%s", s+1);
n = strlen(s+1);
for (i=1; i<=n; ++i)
{
a[++m] = 27;
a[++m] = s[i]-96;
}
a[++m] = 27;
for (i=1; i<=m; ++i)
hs1[i] = (hs1[i-1]*e+a[i])%mo;
for (i=m; i>=1; --i)
hs2[i] = (hs2[i+1]*e+a[i])%mo;
pow[0] = 1;
for (i=1; i<=m; ++i)
pow[i] = pow[i-1]*e%mo;
for (i=1; i<=m; ++i)
{
l = 0;
if (i-1 < m-i) r = i-1+1;
else r = m-i+1;
while (r-l > 1)
{
mid = (l+r)/2;
HS1 = (hs1[i-1]-hs1[i-mid-1]*pow[mid]%mo+mo)%mo;
HS2 = (hs2[i+1]-hs2[i+mid+1]*pow[mid]%mo+mo)%mo;
if (HS1 == HS2) l = mid;
else r = mid;
}
printf("%d\n", l);
}
}
编写程序,求给定字符串s的亲朋字符串s1。
亲朋字符串s1定义如下:给定字符串s的第一个字符的ASCII值加第二个字符的ASCII值,得到第一个亲朋字符; 给定字符串s的第二个字符的ASCII值加第三个字符的ASCII值,得到第二个亲朋字符;依此类推,直到给定字符串s的倒数第二个字符。亲朋字符串的最 后一个字符由给定字符串s的最后一个字符ASCII值加s的第一个字符的ASCII值。
输入
输入一行,一个长度大于等于2,小于等于100的字符串。字符串中每个字符的ASCII值不大于63。
输出
输出一行,为变换后的亲朋字符串。输入保证变换后的字符串只有一行。
样例输入
1234
样例输出
cege
代码实现
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std;
char a[111],b[111];
int main()
{
gets(a);
int n=strlen(a);
for(int i=0;i<n-1;i++)
{
b[i]=a[i]+a[i+1];
printf("%c",b[i]);
//printf("%c",a[i]+a[i+1]);
}
b[n-1]=a[n-1]+a[0];
printf("%c",b[n-1]);
//printf("%c",a[n-1]+a[0]);
return 0;
}
/*#include<cstdio>
#include<cstring>
char a[110];
int main()
{
int n1 ,i;
gets(a);
n1=strlen(a);
for(i = 0; i < n1-1;i++)
{
printf("%c",a[i]+a[i+1]);
}
printf("%c",a[n1-1]+a[0]);
return 0;
}*/
给定一个不包含空白符的字符串,请判断是否是C语言合法的标识符号(注:题目保证这些字符串一定不是C语言的保留字)。
C语言标识符要求:
1. 非保留字;
2. 只包含字母、数字及下划线(“_”)。
3. 不以数字开头。
输入
一行,包含一个字符串,字符串中不包含任何空白字符,且长度不大于20。
输出
一行,如果它是C语言的合法标识符,则输出yes,否则输出no。
样例输入
RKPEGX9R;TWyYcp
样例输出
no
代码实现
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std;
int main()
{
char a[21];
cin>>a;
int n=strlen(a);
if(a[0]>=‘a‘&&a[0]<=‘z‘||a[0]>=‘A‘&&a[0]<=‘Z‘||a[0]==‘_‘)
{
for(int i=1;i<n;i++)
{
if(a[i]<‘0‘||a[i]>‘9‘&&a[i]<‘A‘||a[i]>‘Z‘&&a[i]<‘_‘||a[i]>‘_‘&&a[i]<‘a‘||a[i]>‘z‘)
{
cout<<"no";
return 0;
}
}
}
else
{
cout<<"no";
return 0;
}
cout<<"yes";
return 0;
}
输入
一个字符串,表示一条碱基链。这个字符串只含有大写字母A、T、G、C,分别表示腺瞟呤、胸腺嘧啶、鸟嘌呤和胞嘧啶。字符串长度不超过255。
输出
一个只含有大写字母A、T、G、C的字符串,为与输入的碱基链互补的碱基链。
样例输入
ATATGGATGGTGTTTGGCTCTG
样例输出
TATACCTACCACAAACCGAGAC
代码实现
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
using namespace std;
char a[260];
int main()
{
gets(a);
int n=strlen(a);
for(int i=0;i<n;i++)
{
if(a[i]==‘G‘) printf("C");
if(a[i]==‘C‘) printf("G");
if(a[i]==‘A‘) printf("T");
if(a[i]==‘T‘) printf("A");
}
return 0;
}
把一个字符串中特定的字符全部用给定的字符替换,得到一个新的字符串。
输入
只有一行,由一个字符串和两个字符组成,中间用单个空格隔开。字符串是待替换的字符串,字符串长度小于等于30个字符,且不含空格等空白符;
接下来一个字符为需要被替换的特定字符;
接下来一个字符为用于替换的给定字符。
输出
一行,即替换后的字符串。
样例输入
hello-how-are-you o O
样例输出
hellO-hOw-are-yOu
代码实现
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std;
char a[35],x,y;
int main()
{
cin>>a;
cin>>x>>y;
int n=strlen(a);
for(int i=0;i<n;i++)
{
if(a[i]==x)
a[i]=y;
}
puts(a);
return 0;
}
在情报传递过程中,为了防止情报被截获,往往需要对情报用一定的方式加密,简单的加密算法虽然不足以完全避免情报被破译,但仍然能防止情报被轻易的识别。我们给出一种最简的的加密方法,对给定的一个字符串,把其中从a-y,A-Y的字母用其后继字母替代,把z和Z用a和A替代,其他非字母字符不变,则可得到一个简单的加密字符串。
输入
输入一行,包含一个字符串,长度小于80个字符。
输出
输出每行字符串的加密字符串。
样例输入
Hello! How are you!
样例输出
Ifmmp! Ipx bsf zpv!
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> using namespace std; char a[85],x,y; int main() { gets(a); int n=strlen(a); for(int i=0;i<n;i++) { if(a[i]>=‘a‘&&a[i]<=‘z‘||a[i]>=‘A‘&&a[i]<=‘Z‘) { if(a[i]==‘z‘) a[i]=‘a‘; else { if(a[i]==‘Z‘) a[i]=‘A‘; else a[i]=a[i]+1; } } } puts(a); return 0; }
原文:http://www.cnblogs.com/z360/p/6376084.html