bzoj1398: Vijos1382寻找主人 Necklace 最小表示法

题意

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

分析

首先是可以用最小表示法来判断同构,简单地写一写
首先定义三个值,i,j,k分别是两个头和当前扫到的长度
如果相等就k++,不相等就i+=k+1,或者j+=k+1(大的加)
然后还有可能i=j的时候要手动错开
最后返回小的指针(也就是在串里面的指针就好了)

代码

#include <bits/stdc++.h>
using namespace std;
const int N = 1000010;
struct node{int i,j,k;}; int n;
int mn(char *a)
{
  int i=0,j=1,k=0;
  while(i<n&&j<n&&k<n){
    int t=a[(i+k)%n]-a[(j+k)%n];
    if(!t) k++;
    else{
      if(t>0) i+=k+1;
      else j+=k+1;
      if(i==j) j++;
      k=0;
    }
  }
  return i<j?i:j;
}
char a[N],b[N];
int main(){
  scanf("%s",a); scanf("%s",b); n=strlen(a);
  int x=mn(a),y=mn(b); int k=0;
  while(a[(x+k)%n] == b[(y+k)%n] && k<n) k++;
  if(k==n){
    puts("Yes");
    k=0; while(k<n) printf("%c",a[(x+k)%n]),k++; printf("\n");
  }
  else{
    puts("No");
  }
  return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_39708759/article/details/103128776
今日推荐