题目大意:
给你两个长度相等的字符串,让你判断两个字符串是否相等。两个字符串相等的条件有两个,只要满足一个条件就算是相等的:
一、当前字符串是相等的。
二、将其分成前后两段长度相等的子串之后,a1==b1&&a2==b2||a1==b2&&a2==b1。
思路:
1、我们直接按照题意模拟即可。
2、注意一些常数问题,写的渣可能会TLE掉。注意一些细节,别的就没什么可说的了。
Ac代码:
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
char a[200500];
char b[200500];
char aa[200500];
char bb[200500];
int vis[350];
int n,ok;
int judge(int l1,int r1,int l2,int r2)
{
memset(vis,0,sizeof(vis));
for(int i=l1; i<=r1; i++)
{
vis[a[i]]++;
}
for(int i=l2; i<=r2; i++)
{
vis[b[i]]--;
}
for(int i=1; i<=335; i++)
{
if(vis[i]!=0)return 0;
}
return 1;
}
int Dfs(int l1,int r1,int l2,int r2,int len)
{
if(judge(l1,r1,l2,r2)==0)return 0;
if(l1==r1&&l2==r2)
{
if(a[l1]==b[l2])
return 1;
else return 0;
}
int flag=1;
int j=l2;
for(int i=l1;i<=r1;i++)
{
if(a[i]==b[j])j++;
else flag=0;
}
if(flag==1)return 1;
if(len%2==1)
{
return 0;
}
if((Dfs(l1,(l1+r1)/2,l2,(l2+r2)/2,len/2)&&Dfs((l1+r1)/2+1,r1,(l2+r2)/2+1,r2,len/2)))
{
return 1;
}
if(Dfs(l1,(l1+r1)/2,(l2+r2)/2+1,r2,len/2)&&Dfs((l1+r1)/2+1,r1,l2,(l2+r2)/2,len/2))
{
return 1;
}
return 0;
}
int main()
{
while(~scanf("%s%s",a,b))
{
memset(vis,0,sizeof(vis));
n=strlen(a);
if(judge(0,n-1,0,n-1))
{
int ok;
ok=Dfs(0,n-1,0,n-1,n);
if(ok==1)printf("YES\n");
else printf("NO\n");
}
else printf("NO\n");
}
}