南阳理工学院OJ - 0005 - Binary String Matching
2017-12-22 23:13
375 查看
题目给出n组01字符串,每组字符串有A,B两个,len_A<=10,len_B<=1000,求B中与A相同的字串个数。
C++做法:
用String头文件中的compare函数即可
C语言做法:
既然是01字符串,我们很容易地就能想到位运算操作。那么对区间的移动:
string[a,a+len−1]→string[a,a+len]→string[a+1,a+len]
有:
即将c左移一位与11110111111与运算,0是第len位,再加上新进入区间的字符
C++做法:
用String头文件中的compare函数即可
#include <iostream> #include <string> using namespace std; int main(){ int n,i,j,lena,lenb,cnt;string A,B; cin>>n; for(i=0;i<n;i++){ cin>>A>>B; lena=A.length();lenb=B.length();cnt=0; for(j=0;j<=lenb-lena;j++){ if(B.compare(j,lena,A)==0)cnt++; } cout<<cnt<<endl; } }
C语言做法:
既然是01字符串,我们很容易地就能想到位运算操作。那么对区间的移动:
string[a,a+len−1]→string[a,a+len]→string[a+1,a+len]
有:
c=((c<<1)&~(1<<lena))+B[j]-'0'//c为区间的01字符串代表的二进制数
即将c左移一位与11110111111与运算,0是第len位,再加上新进入区间的字符
#include <stdio.h> #include <string.h> using namespace std; char A[15],B[1005]; int main(){ int n,i,j,a,c,lena,lenb,cnt; scanf("%d",&n); for(i=0;i<n;i++){ scanf("%s%s",A,B); lena=strlen(A);lenb=strlen(B); if(lenb<lena)printf("0\n"); else{ j=a=c=0; while(j<lena){ a=(a<<1)+A[j]-'0'; c=(c<<1)+B[j++]-'0'; } cnt=(a==c); for(j=lena;j<lenb;j++)cnt+=(a==(c=((c<<1)&~(1<<lena))+B[j]-'0')); printf("%d\n",cnt); } memset(A,0,sizeof(A));memset(B,0,sizeof(B)); } }
相关文章推荐
- Binary String Matching(南阳理工OJ)
- 南阳理工oj题目练习---Binary String Matching
- 南阳OJ----Binary String Matching
- 南阳理工学院 Binary String Matching
- 南阳理工oj-5 Binary String Matching
- 南阳oj 5 Binary String Matching
- NYOJ 5 Binary String Matching (kmp 字符串匹配)
- nyoj5 Binary String Matching
- nyoj5Binary String Matching
- NYOJ-5 Binary String Matching
- Binary String Matching
- 题目5:Binary String Matching
- Binary String Matching
- nyoj-5-Binary String Matching
- NYOJ 5 Binary String Matching
- Binary String Matching
- Binary String Matching(kmp+str)
- Binary String Matching
- nyoj5 Binary String Matching
- ACM Binary String Matching