• 【最小表示法】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 }
  • 相关阅读:
    彻悟大师语录
    读书
    复变函数简要
    【洛谷P4781】【模板】拉格朗日插值
    【洛谷P4585】火星商店问题
    【YbtOJ#593】木棍问题
    【YbtOJ#893】带权的图
    【洛谷P4735】最大异或和
    【洛谷P5787】二分图 /【模板】线段树分治
    【ARC098D】Donation
  • 原文地址:https://www.cnblogs.com/iiyiyi/p/5770800.html
Copyright © 2020-2023  润新知