题目描述
给你一个字符串A和一个字符串B,请你计算字符串B的所有旋转形式在字符串A中的出现总次数。
说明:
如果将字符串B描述成B1B2...Bm的形式(m是B的长度),那么B1B2...Bm-1Bm,B2B3...BmB1,...,BmB1...Bm-2Bm-1就是字符串B的所有旋转形式。
说明:
如果将字符串B描述成B1B2...Bm的形式(m是B的长度),那么B1B2...Bm-1Bm,B2B3...BmB1,...,BmB1...Bm-2Bm-1就是字符串B的所有旋转形式。
输入
输入包含多组测试数据。每组输入为两行,第一行输入字符串A,第二行输入字符串B。A的长度不超过1000,B的长度不超过100,所有字符串仅包含小写字母。
输出
对于每组输入,输出字符串B的所有旋转形式在字符串A中的出现总次数。
样例输入 Copy
abab
ab
aaaa
a
aaaa
aa
样例输出 Copy
3
4
3
思路:我摊牌了。我是laji。这个题做的时候题都看不懂。网上百度知道的答案居然AC了。绝了,回头琢磨琢磨。
#include <stdio.h> #include <iostream> #include <cstring> using namespace std; void change(char a[]) { char t; t=a[0]; int i; for(i=0;a[i+1]!=' ';i++) { a[i]=a[i+1]; } a[i]=t; } void Find(int i,int j,char a[],char b[]) { int k,l; for(k=i,l=0;k<i+j;k++,l++) { b[l]=a[k]; } b[l]=' '; } int main() { char a[1001],b[101],c[101]; int i,j=0,k=0,n; while(gets(a)) { gets(b); n=strlen(b); j=0; k=0;//每次要清内容 for(i=0;a[i+n-1]!=' ';i++) { Find(i,n,a,c); while(strcmp(b,c)!=0) { change(b); k++; if(k>=n) break; } if ( strcmp(b,c)==0 ) j++; } printf("%d ",j); } return 0; }