题意:
给出一个字符串的后缀数组的排序后的SA数组,让你构造一个这样的字符串,使其后缀数组SA数组和给定的SA数组一样,问你,最少需要多少个不同的字符来构造这个字符串。
分析:
理解后缀数组中:SA[]、rank[]、height[]意义。
假设有两个后缀a和b,若a<b,则有两种情况可以满足:
①a[0]<b[0]
②a[0]=b[0],且以a[1]开始的后缀数组<以b[1]开始的后缀数组
为了保证所用字符种类最少,优先选择第②种情况来进行考虑,若第②种情况不满足,则根据①来构造。
具体实现代码:
#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <ctime>
using namespace std;
class SuffixArrayDiv1 {
public:
int minimalCharacters(vector <int>);
int rank[55];
};
int SuffixArrayDiv1::minimalCharacters(vector <int> SA) {
int sz=SA.size();
for(int i=0;i<sz;i++)
{
rank[SA[i]]=i;
}
rank[sz]=-1;
int ans=1;
for(int i=0;i<sz-1;i++)
{
if(rank[SA[i]+1]>rank[SA[i+1]+1]) ans++;
}
return ans;
}
<%:testing-code%>
//Powered by [KawigiEdit] 2.0!