Số lần lặp lại của xâu con trong xâu

Mọi người cho em hỏi bài này với ạ (nó gọi là lặp lại tandem). Em đã code xong đc phần kiểm tra xâu lặp vào số lần lặp liên tiếp của nó. Nhưng em bị mắc chỗ khai báo chiều dài của xâu và xử lý chỗ M dòng xâu con không biết làm thế nào. Mong mọi người giúp em với ạ.


#include<iostream>
#include<string>

using namespace std;

bool strcmpr(string str1, string str2){
	int i, j, m, n;
	m = str1.length();
	n = str2.length();
	for(i = 0; i < m;){
		for(j = 0; j < n;)
		{
			if(str1[i] != str2[j])
				return false;
			else{
				i ++;
				j ++;
			}
		}
	}
	return true;
}

int tandem(int m, int n, string str){
	m = m - 1;
	n = n - m;
	int count = 0;
	string str1 = str.substr(m, n);
	for(int i = m; i < str.length(); i += n){
		string str2 = str.substr(i, n);
		if(strcmpr(str1, str2) == 1)
			count ++;
		else
			break;
	}
	cout << count;
}


int main(){
	int b;
	cin >> b;
	string str;
	getline(cin, str);
	int i, j, m, n, x;
	for(x = 0; x < b; x++){
		cin >> m >> n;
		tandem(m, n, str);
	}
}

Đã dùng std::string thì không cần khai báo độ dài của xâu đâu.

Nhưng mà bài nó bắt khai báo ý ạ, kiểu mình phải nhập vào ý ạ, còn chỗ M xâu con anh có hướng gì không ạ

Bạn nhập n vào cho vui thôi, có lúc sẽ dùng đến.

m là số truy vấn (x, y) cần duyệt, phải giữ biến này.

1 Like

khi xử lý chỗ vòng lặp m em bị lỗi này ạ :frowning:

Hầy, truy cập ngoài mảng rồi, up code lên đi bạn.

code đây ạ

#include<iostream>
#include<string>

using namespace std;

bool strcmpr(string str1, string str2){
	int i, j, m, n;
	m = str1.length();
	n = str2.length();
	for(i = 0; i < m;){
		for(j = 0; j < n;)
		{
			if(str1[i] != str2[j])
				return false;
			else{
				i ++;
				j ++;
			}
		}
	}
	return true;
}

int tandem(string str){
	int m, n;
	cin >> m >> n;
	m = m - 1;
	n = n - m;
	int count = 0;
	string str1 = str.substr(m, n);
	for(int i = m; i < str.length(); i += n){
		string str2 = str.substr(i, n);
		if(strcmpr(str1, str2) == 1)
			count ++;
		else
			break;
	}
	return count;
}

int main(){
	int a, b;
	cin >> a >> b;
	string source;
	getline(cin, source);
	for(int i = 0; i < b; i++){
		cout << tandem(source);
	}
}

Đoạn này

Nếu bạn đã muốn tăng i, j cùng lúc thì chạy 1 chỉ số thôi. Với lại, nếu i đã vượt khỏi m mà j vẫn chưa vượt khỏi m thì sao? Code vẫn cứ chạy như thường.

Ý tưởng của em là chia cái xâu ban đầu thành những xâu con bằng nhau nên trong trường hợp này m = n ạ @. Với cả sửa lại thì vẫn bị lỗi như trên ạ

Hàm strcmpr của bạn dùng để làm gì? Bây giờ có thể thuật toán của bạn đang sai.

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?