本题思路:
首先判断是一道字符串前后缀的题目 题意为:给出长度为n的字符串的所有n-1个前缀和n-1个后缀,要求判断每个子串是前缀还是后缀 那么最简单的思路就是先找到原串 再根据原串判断是否为前后缀即可
那么如何找到原串呢??
由于前缀和后缀是长度为1到n-1的都有两个 那么判断出其中长度为n-1的前缀和后缀 再不断枚举即可求解
题目描述
(中文翻译修改版本)
这题主要是检验大家对后缀数组专题的学习成果。
给定一个长度为n的字符串,现在乱序输入n-1个它的前缀,n-1个它的后缀。
都不包含它自身。
现在问你哪些是它的前缀,哪些是它的后缀。
Input
输入n代表字符串长度(2 ≤ n ≤ 100),接下来输入2n-2个字符串保证合法。
Output
按照输入顺序,如果当前字符串是前缀则输出P,否则S
样例
输入:
4
DBM
BMN
MN
D
DB
N
输出:
PSSPPS
#include <iostream>
#include<vector>
#include<map>
using namespace std;
vector<string> vect,s1;
int main()
{
int n;
cin>>n;
int cnt=0;
for(int i=0;i<2*n-2;i++)
{
string s2;
cin>>s2;
vect.push_back(s2);
if(s2.size()==n-1)
s1.push_back(s2);
}
string s3;
for(int i=0;i<vect.size();i++)
if(s1[0].substr(1,n-2)==s1[1].substr(0,n-2)&&vect[i]==s1[0].substr(0,vect[i].size())) cnt++;
if(cnt<n-1)
{
s3=s1[1]+s1[0][n-2];
}
else
{
s3=s1[0]+s1[1][n-2];
}
map<int,int> hash;
string ans;
for(int i=0;i<vect.size();i++)
{
if(!hash[vect[i].size()]&&vect[i]==s3.substr(0,vect[i].size()))
{
ans+="P";
hash[vect[i].size()]++;
}
else
ans+= "S";
}
cout<<ans<<endl;
return 0;
}