题意:
给出一个字符串,让你构造另一个字符串,使得两个字符串产生的后缀数组SA数组相同,且你构造的字符串<题目原串,问这种串是否存在,分别输出“Exists”和“Does not exist”。
分析:
先求出原串的后缀数组SA[],然后根据SRM630中DIV1的500解决思路,构造出最小的且花费字符个数最少的串,最后这个串和原串是否相同。
具体代码:
#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 SuffixArrayDiv2 {
public:
string smallerOne(string);
vector<pair<string,int> > ve;
int sa[55],rank[55];
int str[55];
};
string SuffixArrayDiv2::smallerOne(string s) {
int sz=s.size();
for(int i=0;i<sz;i++)
{
ve.push_back(make_pair(s.substr(i,sz-i),i));
}
sort(ve.begin(),ve.end());
for(int i=0;i<sz;i++)
{
sa[i]=ve[i].second;
rank[sa[i]]=i;
}
rank[sz]=-1;
int now=0;
for(int i=0;i<sz-1;i++)
{
if(rank[sa[i]+1]<rank[sa[i+1]+1])
{
str[sa[i]]=str[sa[i+1]]=now;
}
else
{
str[sa[i]]=now++;
str[sa[i+1]]=now;
}
}
for(int i=0;i<sz;i++)
{
if(str[i]!=s[i]-'a') return "Exists";
}
return "Does not exist";
}
<%:testing-code%>
//Powered by [KawigiEdit] 2.0!