Codeforces Round #313 (Div. 2) D. Equivalent Strings 字符串

Note

In the first sample you should split the first string into strings "aa" and "ba", the second one — into strings "ab" and "aa". "aa" is equivalent to "aa"; "ab" is equivalent to "ba" as "ab" = "a" + "b", "ba" = "b" + "a".

In the second sample the first string can be splitted into strings "aa" and "bb", that are equivalent only to themselves. That’s why string "aabb" is equivalent only to itself and to string "bbaa".

题意,给出两个字符串,确定,是否相等,定义字符串是否相等为,如果为奇数串,只能比较是否每个字符相同,如果为偶数串,,第一个串分成两个相等长度的串为a1 b1,第二个串也分成a2 b2,a1== a2 && b1 == b2 || a1 == b2 && a2 == b2.

第一种方法,直接按照定义,偶数串的时候,两个都比较一下,得出答案,这样的复杂度很高,但测试数据不是很复杂,故也能过。由于字符串的特性,以及奇数串的时候,直接判定,几乎这种方法,是不可取的。时间几乎是第二种方法的20倍以上吧。

#define N 200500#define M 100005#define maxn 205#define MOD 1000000000000000007int n,len[2];char str[2][N];bool equalstr(char st1[],char st2[],int s1,int e1,int s2){for(int i = s1;i<=e1;i++){if(st1[i] != st2[s2++]) return false;}return true;}bool Check(char str1[],char str2[],int s1,int e1,int s2,int e2){//printf("%d %d %d %d\n",s1,e1,s2,e2);int l = (e1 – s1 + 1);if(l & 1){return equalstr(str1,str2,s1,e1,s2);}else {int mid = l / 2;if( Check(str1,str2,s1,s1 + mid – 1,s2,s2 + mid – 1)&& Check(str1,str2,s1 + mid,e1,s2 + mid ,e2)) return true;if( Check(str1,str2,s1,s1 + mid – 1,s2 + mid ,e2)&& Check(str1,str2,s1 + mid,e1,s2,s2 + mid – 1)) return true;}return false;}int main(){while(SS(str[0])!=EOF){SS(str[1]);len[0] = strlen(str[0]);len[1] = strlen(str[1]);if(Check(str[0],str[1],0,len[0] – 1,0,len[1] – 1)){printf("YES\n");}elseprintf("NO\n");}return 0;}第二种方法,直接把字符串内部排序。因为,偶数个字符串的,前部分与后部分,是哪个顺序,并不影响这个字符串的大小,所以我们要使一个字符串只有一种表达方法,也就是如果是偶串,则要求,前面的串比后半部分的串要小,这样就可以唯一化了,比第一种方法要快很多倍了。只是在处理字符串上花费时间,复杂度是线性的。

void Change(char str[],int s,int e){int l = e – s + 1,s1,s2;if(l & 1) return ;l = l>>1;s1 = s;s2 = s + l;for(int i = 0;i < l;i++,s1++,s2++){if(str[s1] > str[s2]) {s1 = s;s2 = s + l;for(int j = 0;j< l;j++,s1++,s2++){swap(str[s1],str[s2]);}break;}else if(str[s1] < str[s2]) break ;}Change(str,s,s + l – 1);Change(str,s + l,e);}int main(){while(SS(str[0])!=EOF){SS(str[1]);len[0] = strlen(str[0]);Change(str[0],0,len[0] – 1);//cout<<str[0]<<endl;len[1] = strlen(str[1]);Change(str[1],0,len[1] – 1);//cout<<str[1]<<endl;if(!strcmp(str[0],str[1])){printf("YES\n");}elseprintf("NO\n");}return 0;}

天才就是这样,终身努力,便是天才。

Codeforces Round #313 (Div. 2) D. Equivalent Strings 字符串

相关文章:

你感兴趣的文章:

标签云: