字符串之最小表示法

1.暴力算法:O(N^2)

2.kmp匹配:O(N)::同构:环,环拆成连个相连的链(常用技巧),然后匹配

3.最小表示法:比较和判重,数据有序化(最小表示),附代码:#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
const int maxn=1000002;
int l;
char s1[maxn],s2[maxn];
void init(){
scanf("%d\n%s\n%s",&l,&s1,&s2);
}


int mp(char *s,int l){
int i=0,j=1,k=0,t;
while (i<l&&j<l&&k<l){
t=s[(i+k)%l]-s[(j+k)%l];
if (!t) k++;
else{ if (t>0) i=i+k+1;
     else j=j+k+1;
     if (i==j) i++;
     k=0;
}
}
return min(i,j);
}


bool check(int a,int b){
for (int i=0;i<l;i++)
 if (s1[(a+i)%l]!=s2[(b+i)%l]) return 0;
return 1;
}


int main(){
init();
int a=mp(s1,l),b=mp(s2,l);
if (check(a,b)) cout<<1;
else cout<<0;
return 0;
}

让我们来解读一下它的工作原理吧,,1.无法比较则数据有序化后比较,求最小表示 2.指针和滑块原则 3.拆环成链 4.匹配,后缀数组与其联系紧密

证明很简单,不过注意要在循环同构的假设和前提下证明,复杂度线性,让我们来看几个拓展:1.由串的同构问题变为树的同构问题

2.由树的同构问题变为图的同构问题 

1.树的同构:poj1635:深搜读入,判断同构问题最小化思想,将01序列根据深搜有序化,每一个节点所有子树进行排序,递归进行(代码12.7)

2图的同构:这是一个很有意思的课题,继续下去,学习

你可能感兴趣的:(字符串之最小表示法)