题意:有一个长度为n的字符串 (1<=n<=100) ,现在不按顺序给出它的n-1个前缀和n-1个后缀一共2n-2个字符串,请判断每个字符串是前缀或后缀。
思路:这题想复杂了,一直没搞出来,最终看了别人题解才知道直接暴力枚举出可能的原串(一共8种可能),每种都判断一下就可以…
#include<bits/stdc++.h>
using namespace std;
const int maxn=500;
int n;
map<string,int> mp;
string temp[maxn];
string s[maxn];
bool flag=0;
int len;
bool cmp(string &a,string &b)
{
return (int)a.length()>(int)b.length();
}
void solve(string str)
{
for(int i=1;i<=n;i++)
{
int len2=temp[i].size();
bool ok=0;
if(str.substr(0,len2)==temp[i]) ok=1;
else if(str.substr(len-len2)==temp[i]) ok=1;
if(!ok) return;//不符合
}
//出这个循环说明找到了原串,下面判读各子串是前缀还是后缀就可以了
//有个注意的地方,如果长度相等的2个串相同,那么一个是S 一个是P ,用map标记一下
flag=1;
for(int i=1;i<=n;i++)
{
int len2=temp[i].size();
if(mp[temp[i]])//第二次出现
printf("%c",mp[temp[i]]);
else //第一次出现
{
if(str.substr(0,len2)==temp[i])
{
printf("P");
mp[temp[i]]='S';//第二次出现就是S
}
else //不是前缀那就只能是后缀了
{
printf("S");
mp[temp[i]]='P';
}
}
}
}
int main()
{
// ios::sync_with_stdio(false);
// cin.tie(0);
// cout.tie(0);
scanf("%d",&n);
len=n;
n=n*2-2;
for(int i=1;i<=n;i++)
{
cin>>temp[i];
s[i]=temp[i];
}
sort(s+1,s+1+n,cmp);//按长度排序
solve(s[1]+s[n]);//2*2*2 8种组合方式
if(!flag) solve(s[1]+s[n-1]);
if(!flag) solve(s[n]+s[1]);
if(!flag) solve(s[n-1]+s[1]);
if(!flag) solve(s[2]+s[n]);
if(!flag) solve(s[2]+s[n-1]);
if(!flag) solve(s[n]+s[2]);
if(!flag) solve(s[n-1]+s[2]);
cout<<'\n';
// system("pause");
return 0;
}