给你一个字符串A和一个字符串B,请你计算字符串B的所有旋转形式在字符串A中的出现总次数。
说明:
如果将字符串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

代码示例(自己写的,只能过平台,不完美)

//#include<iostream>
//#include<string>
//#include<string.h>
//#include<cstring>
//using namespace std;
//void Find(int i, int n, string &s1,string &s3);
//void change(string &s);
//
//int main() {
//    string s1,s2 = "",s3 = "";
//    while(getline(cin,s1)) {
//        cin >> s2;
//        getchar();
////        s3.resize(101);
//        int n = s2.length();
//        int k,cnt = 0;
//        for(int i = 0; (i + n - 1) < s1.length(); i++) {
//            k = 0;//控制while循环次数,change一遍后break,要不会无限循环!每次i变化后置零
//            Find(i,n,s1,s3);//利用函数Find()提取s1[]中的子串赋给s3[]
////            cout << s3 << endl; 调试用
////            while(strcmp(s2.c_str(),s3.c_str()) != 0){
//            while(s2 != s3) {
//                change(s2);//该函数使短串变换,并让每次变换后的s2继续与S3进行比较,看是否相等
//                k++;//记录翻转次数
//                if(k >= n) { //控制change次数,change一轮后退出,不要无限循环
//                    break;
//                }
//            }
////            if(strcmp(s2.c_str(),s3.c_str()) == 0){//两者相等,则出现一次
//            if(s2 == s3) {
//                cnt++; //计数
//            }
//            s3.clear();//每次i变换即进行过一次Find函数都要把s3重置,以重新获取s1的子串。
//        }
//        cout << cnt << endl;
//    }
//    return 0;
//}
//void Find(int i,int n, string &s1,string &s3) { //此处需将i和n的值都传入函数
//    int k,l;
//    for(k = i,l = 0; k < i + n; k++,l++) { //由于在一次接收输入后n不变,而i在for循环中为了控制s1(即长串) 不超限在递增
//        //故引入k使得k < i +n(而不是直接k < n),则每次循环也可循环n次,给s3[]赋值n次,与将要对比的s2[]长度相等
//        s3 += s1[k];//当i = 0时,使得s1得前n个字符(从s[i]开始)赋值给s3 ,后面需随着i变化同理提取长串中的相邻字符(引入i的原因)
////        s3[l] = s1[k]; //切记这么赋值是错误的,虽然可以提前开辟s3的空间(上面的s3.resize()),但是会多一个空行
//    }
//}
//
//void change(string &s) { //在while循环中会不停调用此函数不停变换短串s2
//    char t;
//    int i;
//    t = s[0];//用哨兵暂存储第一个字符
//    for(i = 0; i < s.length() - 1; i++) { //不要超界
//        s[i] = s[i + 1];//将后面的字符赋值给前面,不停完成轮换以检验变换后的多个s2......是否会在s1中出现
//    }
//    s[i] = t;//将哨兵中的字符赋值给字符串最后一个位置
//}

//#include<iostream>
//#include<string>
//#include<string.h>
//#include<cstring>
//using namespace std;
//void Find(int i, int n, char s1[],char s3[]); 
//void change(char s[]);
//
//int main(){
//    char s1[1001],s2[101],s3[101];//s1长串,s2短串,s3为提取是s1子串 
//    while(scanf("%s",s1) != EOF){
//        scanf("%s",s2);
//        int n = strlen(s2);
//        int k,cnt = 0;
//        for(int i = 0; (i + n - 1) < strlen(s1); i++){
//            k = 0;//控制while循环次数,change一遍后break,要不会无限循环!每次i变化后k置零 
//            Find(i,n,s1,s3);//利用函数Find()提取s1[]中的子串赋给s3[] 
//            while(strcmp(s2,s3) != 0){
//                change(s2);//该函数使短串翻转,并让每次翻转后的s2继续与S3进行比较,看是否相等 
//                k++;//记录翻转次数 
//                if(k >= n){//控制change次数,change一轮后退出,不要无限循环 
//                    break;
//                } 
//            }
//            if(strcmp(s2,s3) == 0){//两者相等,则出现一次 
//                cnt++; 
//            }    
//        }
//        cout << cnt << endl;
//    }
//    return 0;
//}
//void Find(int i, int n, char s1[],char s3[]){//此处需将i和n的值都传入函数 
//    int l,k;
//    for(k = i,l = 0; k < i + n; l++,k++){//由于在一次接收输入后n不变,而i在for循环中为了控制s1(即长串) 不超限在递增
//    //故引入k使得k < i +n(而不是直接k < n),则每次循环也可循环n次,给s3[]赋值n次,与将要对比的s2[]长度相等 
//        s3[l] = s1[k];//当i = 0时,使得s1得前n个字符(从s[i]开始)赋值给s3 ,后面需随着i变化同理提取长串中的相邻字符(引入i的原因) 
//    } 
//    s3[l] = '\0';//最后一个字符添加结束字符'\0'    
//}
//
//void change(char s[]){//在while循环中会不停调用此函数不停变换短串s2 
//    char t;
//    int i;
//    t = s[0];//用哨兵暂存储第一个字符 
//    for(i = 0; i < strlen(s) - 1; i++){ 
//        s[i] = s[i + 1];//将后面的字符赋值给前面,不停完成轮换以检验变换后的多个s2......是否会在s1中出现 
//    }
//    s[i] = t;//将哨兵中的字符赋值给字符串最后一个位置 ('\0'之前) 
//}


沐小轲
9 声望0 粉丝

C++初学者