Chào mọi người. Mình/em có bài tập như này. Cho một xâu độ dài không quá 100. đếm xem xâu đó có bao nhiêu cặp xâu con tương đương (2 xâu tương đương là 2 hoán vị kí tự của nhau).
Mình có ý tưởng thế này. Nhưng case phức tạp thì bị time limit exceeded. Dùng cách sort cũng k ổn :((. Giúp mình/em tối ưu đoạn code với.
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
bool similar(string a, string b)
{
int n=a.length(), flag=0;
char str[26]; int A[26]={0}; int B[26]={0};
for(int i=97; i<123; i++)
{
str[i-97]=i;
}
for(int i=0; i<n; i++)
{
for(int j=0; j<26; j++)
{
if(a[i]==str[j]) A[j]++;
if(b[i]==str[j]) B[j]++;
}
}
for(int i=0; i<26; i++)
if(A[i]!=B[i]) flag=1;
if(flag==0) return true;
if(flag==1) return false;
}
int count(string s)
{
int n=s.length(); int count=0;
for(int k=1; k<n; k++)
{
for(int i=0; i<n-k+1; i++)
{
for(int j=i+1; j<n-k+1; j++)
if(similar(s.substr(i, k), s.substr(j, k))) count++;
}
}
return count;
}
int main()
{
int n; cin >> n;
char a[100];
while(n>0)
{
scanf("%s", a);
printf("%i", count(a));
printf("\n");
n--;
}
return 0;
}

vì vậy bỏ cái vòng lặp j < 26 là đúng.
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?