工艺
最小表示法:
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 }
可以求出两个字符串的最小表示后,判断两个字符串是否同构