Codeforces Round #527 (Div. 3) CF1092C Prefixes and Suffixes
阿新 • • 發佈:2018-12-24
思路:
可以知道原序列一定是由給出的最長的兩個字串拼接而成的,所以可以嘗試把最長的兩個字串按兩種相對位置拼接。
設一個數組b。
對於每種拼接方法——
如果一個串可以放在字首的位置而不能放在後綴的位置,就把b[i]設為1。
如果一個串可以放在後綴的位置而不能放在字首的位置,就把b[i]設為2。
如果一個串可以放在字首的位置也可以放在後綴的位置,就把b[i]設為0。
如果都不能放,就說明這種情況不可行。
然後對於兩個b為0的相同子串,用一個map儲存,分別放在字首和字尾就好了。
程式碼:
#include <bits/stdc++.h>
using namespace std;
#define read(x) scanf("%d",&x)
#define maxn 10000
int n;
string s[maxn*2+5];
string s1,s2,s3,s4;
string a;
int b[maxn+5];
map<string,int> mp;
int main() {
read(n);
for(int i=1; i<=n*2-2; i++) {
cin>>s[i];
if(s[i].size()==n-1) {
if (s1.size()==0) s1=s[i];
else s2=s[i];
}
if(s[i].size()==1) {
if(s3.size()==0) s3=s[i];
else s4=s[i];
}
}
if(s1+s2[s2.size()-1]==s1[0]+s2&&((s3[0]==s1[0]&&s4[0]==s2[s2.size()-1])||(s4[0]==s1[0]&&s3[0]==s2[s2.size()-1]))) {
a=s1+s2[s2.size()-1];
} else a=s2+s1[s1.size ()-1];
int ans1=0,ans2=0;
FRT:;
for(int i=1;i<=n*2-2;i++) {
int f1=1,f2=1;
for(int j=0;j<s[i].size();j++) {
if(s[i][j]!=a[j]) {
f1=false;
break;
}
}
for(int j=0;j<s[i].size();j++) {
if(s[i][j]!=a[n-s[i].size()+j]) {
f2=false;
break;
}
}
if(f1&&!f2) b[i]=1,ans1++;
else if(f2&&!f1) b[i]=2,ans2++;
else if(0==f1&&0==f2) {
for(int x=1;x<a.size();x++)swap(a[x-1],a[x]);
ans1=0,ans2=0;
memset(b,0,sizeof(b));
goto FRT;
}
}
for(int i=1;i<=n*2-2;i++) {
if(b[i]==1) {
printf("P");
} else if(b[i]==2) {
printf("S");
} else if(mp.count(s[i])) {
int y=3-mp[s[i]];
if(y==1) {
printf("P");
ans1++;
} else {
printf("S");
ans2++;
}
} else {
if(ans1<n-1) {
printf("P");
ans1++;
mp[s[i]]=1;
} else {
printf("S");
ans2++;
mp[s[i]]=2;
}
}
}
return 0;
}