【题目大意】
判断两个字符串是否循环同构。
【思路】
我一开始的做法是直接同时在两个字符串上求最小表示法,只有部分测试点能过,理由未知,以后再来思考。
现在做法:分别求出两个字符串的最小表示法,再比较是否相等。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 const int MAXN=1000000+500; 7 char a[MAXN*2],b[MAXN*2]; 8 int n,m; 9 10 void init() 11 { 12 scanf("%s",a); 13 scanf("%s",b); 14 n=strlen(a); 15 m=strlen(b); 16 for (int i=0;i<n;i++) a[i+n]=a[i],b[i+n]=b[i]; 17 } 18 19 int getmin(char *s) 20 { 21 int i=0,j=1,k=0; 22 while (i<2*n && j<2*n && k<n) 23 { 24 int t=s[(i+k)%(2*n)]-s[(j+k)%(2*n)]; 25 if (!t) k++; 26 else 27 { 28 if (t>0) i+=k+1; 29 else j+=k+1; 30 if (i==j) j++; 31 k=0; 32 } 33 } 34 return min(i,j); 35 } 36 37 void solve() 38 { 39 int cala=getmin(a); 40 int calb=getmin(b); 41 int flag=1; 42 for (int i=0;i<n;i++) 43 if (a[(i+cala)%(2*n)]!=b[(i+calb)%(2*n)]) 44 { 45 flag=0; 46 break; 47 } 48 if (flag) 49 { 50 puts("Yes"); 51 for (int i=0;i<n;i++) printf("%c",a[(i+cala)%(2*n)]); 52 } 53 else puts("No"); 54 } 55 56 int main() 57 { 58 init(); 59 if (n==m) solve(); 60 else puts("No"); 61 return 0; 62 }