【最小表示法】BZOJ1398-寻找朋友

【题目大意】

判断两个字符串是否循环同构。

【思路】

我一开始的做法是直接同时在两个字符串上求最小表示法,只有部分测试点能过,理由未知,以后再来思考。

现在做法:分别求出两个字符串的最小表示法,再比较是否相等。

 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 }
原文地址:https://www.cnblogs.com/iiyiyi/p/5770800.html