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; }
来源:博客园
作者:阿楚姑娘
链接:https://www.cnblogs.com/450go/p/11519661.html