1. 程式人生 > >Codeforces Round #527 (Div. 3) CF1092C Prefixes and Suffixes

Codeforces Round #527 (Div. 3) CF1092C Prefixes and Suffixes

題目:Prefixes and Suffixes


思路:

可以知道原序列一定是由給出的最長的兩個字串拼接而成的,所以可以嘗試把最長的兩個字串按兩種相對位置拼接。

設一個數組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; }