01/10/2018, 15:21

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);
	}
}
HK boy viết 17:24 ngày 01/10/2018

khai báo chiều dài của xâu

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

Nobi Sewashi viết 17:34 ngày 01/10/2018

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 ạ

HK boy viết 17:29 ngày 01/10/2018

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.

Nobi Sewashi viết 17:29 ngày 01/10/2018

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

HK boy viết 17:23 ngày 01/10/2018

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

Nobi Sewashi viết 17:26 ngày 01/10/2018

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);
	}
}
HK boy viết 17:21 ngày 01/10/2018

Đoạn này

for(i = 0; i < m;){
		for(j = 0; j < n;)
		{
			if(str1[i] != str2[j])
				return false;
			else{
				i ++;
				j ++;
			}
		}
	}

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.

Nobi Sewashi viết 17:35 ngày 01/10/2018

Ý 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 ạ

HK boy viết 17:34 ngày 01/10/2018

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.

Bài liên quan
0