zoukankan      html  css  js  c++  java
  • 【最小表示法】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 }
  • 相关阅读:
    hibernate和mybatis区别
    Spring事务的传播行为和隔离级别
    数组拷贝
    spring mvc 一次请求 两次查询
    手游性能之渲染分析3
    Android pm 命令详解
    Android am命令使用
    Android dumpsys命令详细使用
    java处理高并发高负载类网站的优化方法
    关于ArrayList的5道面试题
  • 原文地址:https://www.cnblogs.com/iiyiyi/p/5770800.html
Copyright © 2011-2022 走看看