A
链接:https://ac.nowcoder.com/acm/contest/1083/A
来源:牛客网
给出一个字符串s,你需要做的是统计s中子串”abc”的个数。子串的定义就是存在任意下标a<b<c,那么”s[a]s[b]s[c]”就构成s的一个子串。如”abc”的子串有”a”、”b”、”c”、”ab”、”ac”、”bc”、”abc”。
#include<bits/stdc++.h>
using namespace std ;
int main ()
{
string ch;
cin>>ch;
int k=ch.size(),a=0,b=0,c=0;
for(int i=0;i<k;i++)
{
if(ch[i]=='a') a++;
if(ch[i]=='b') b+=a;
if(ch[i]=='c') c+=b;
}
cout<<c;
return 0;
}
这道题刚看的时候想用搜索,但是仔细就会发现子串的记录也有规律。。。每次循环一次如果是a则记录a出现的次数,b=b+a的意思就是每次记录包含ab的子串,出现一次b便有(b+a)个(ab)子串,同理c 。循环一次就解决了。
B
链接:https://ac.nowcoder.com/acm/contest/1083/B
来源:牛客网
给出一个长度为n的字符串s和q个查询。对于每一个查询,会输入一个字符串t,你需要判断这个字符串t是不是s的子串。子串的定义就是存在任意下标a<b<c<d<e,那么”s[a]s[b]s[c]s[d]s[e]”就构成s的一个子串。如”abc”的子串有”a”、”b”、”c”、”ab”、”ac”、”bc”、”abc”。
第一次做超时了。。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,q;
string ch;
cin>>n>>q;
cin>>ch;
while(q--)
{
int i=0,j=0;
string a;
cin>>a;
while(j<a.size()&&i<ch.size())
{
if(ch[i]==a[j])
{
j++;
}
i++;
}
if(ch[i-1]!=a[j-1]) cout<<"NO"<<endl;
else cout<<"YES"<<endl;
}
return 0;
}
第二次参考别人代码。。
#include<bits/stdc++.h>
using namespace std;
string a;
string str;
int main()
{
int n,q;
scanf("%d%d",&n,&q);
//getchar();
cin>>a;
//cout<<"a:"<<a<<endl;
while(q--)
{
cin>>str;
int position=0;
int ok=1;
int L=str.length();
for(int i=0;i<L&&ok;i++)
{
//从字符串a 下标position开始,查找字符串str[i] ,返回str[i] 在a 中的下标
auto iter=a.find(str[i],position);
//cout<<"iter:"<<iter<<endl;
// cout<<"position:"<<position<<endl;
//cout<<"npos:"<<a.npos<<endl;
if(iter==a.npos) ok=0;
//npos 是一个常数,用来表示不存在的位置(在string中找不到某个要查找的字符)
else position=iter+1;
}
if(ok) printf("YES\n");
else
printf("NO\n");
}
return 0;
}
C 勾股定理
#include<bits/stdc++.h>
using namespace std;
int main()
{
long long n;
cin>>n;
if(n<3) cout<<"-1";
else{
if(n%2==0) cout<<n*n/4-1<<" "<<n*n/4+1;
else
cout<<(n*n+1)/2<<" "<<(n*n-1)/2;
}
return 0;
}