Codeforces_Round527_Div3_C題--Prefixes and Suffixes
阿新 • • 發佈:2018-12-25
樣例
Input
5 ba a abab a aba baba ab aba
Output
SPPSPSPS
Input
3 a aa aa a
Output
PPSS
題意:
就是給目標字串的所有字首和字尾 但是不告訴你哪個是字首那個是字尾
讓你去判斷 字首就輸出 P 字尾輸出S 結果不唯一 符合題意就ok
解法:
因為給出了目標串的所有字首和字尾 那麼 我們找到最長的那兩個
這兩個肯定一個是字首 一個是字尾
然後我們拿到最長的字首串 去遍歷所有給出的字串 是字首的肯定前邊部分相同 不相同的就輸出S
但是如何判斷最長的兩個誰是字首誰是字尾呢?方法如下:
比如 目標串是 “abcde” 那麼 字首串和字尾串中最長的兩個 是 abcd 和 bcde
如果 abcd 去掉第一個字母 等於 bcde去掉最後一個字母 那麼abcd就是字首
反之 abcd就是字尾
寫到這裡 看似解決了所有的問題了 但是還有一個特殊情況 迴文串
比如 目標串是 ababa 這種情況
5
ba
a
baba
a
aba
abab
ab
aba
最長的兩個是 baba 和 abab 這兩個無法判斷出來誰是字首誰是字尾
所以 我們還需要加個操作 解決這種特殊情況
我們在兩個最長的串中 隨便選一個 當作字首 去遍歷所給的所有串
如果 其他串等於這個串的前面部分 那麼就符合字首 計數 看看有幾個符合字首的
如果符合字首的串的數量大於等於一半 那麼他就是字首 否則他是字尾
ps:還需要注意一個小問題 有的串既符合字首又符合字尾 但是輸出P和S的數量要相等,我們需要一個標記,來保證輸出的P和S的數量一樣。
程式碼
#include<bits/stdc++.h>
using namespace std;
int cnt[300],n,f;
int main(){
string mx1="",mx2="",pr,s[300];
scanf("%d",&n);getchar();
for(int i=1;i<=2*n-2;i++){
cin>>s[i];
if(s[i].size()==n-1){//記錄最長的
if(mx1.size()==0)mx1=s[i];
else mx2=s[i];
}
}
for(int i=1;i<=2*n-2;i++){//計數
if(mx1.substr(0,s[i].size())==s[i])f++;
}
//判斷字首字尾
if(f>=(2*n-2)/2 && mx1.substr(1,n-2)==mx2.substr(0,n-2)){
pr=mx1;
}
else{
pr=mx2;
}
for(int i=1;i<=n*2-2;i++){
if(s[i]==pr.substr(0,s[i].size()) && cnt[s[i].size()]!=1){
cnt[s[i].size()]=1;//做標記
printf("P");
}
else{
printf("S");
}
}
}