工艺

最小表示法:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<cmath>
 6 using namespace std;
 7 const int maxn=300007;
 8 int n,a[maxn<<1],pos;
 9 int main(){
10   cin>>n;
11   for(int i=0;i<n;i++) {cin>>a[i];a[i+n]=a[i];}
12   int i=0,j=1,k;
13   while(i<n&&j<n){
14     k=0;while(a[i+k]==a[j+k]&&k<n) k++;
15     if(k==n-1) break;
16     if(a[i+k]>a[j+k]){i=i+k+1;if(i==j) i++;}
17     else {j=j+k+1;if(i==j) j++;}
18   }
19   pos=min(i,j);
20   for(int i=pos;i<=pos+n-1;i++) cout<<a[i]<<" "; cout<<endl;
21 }

可以求出两个字符串的最小表示后,判断两个字符串是否同构

猜你喜欢

转载自www.cnblogs.com/lcan/p/9911555.html