1. 程式人生 > >Codeforces_Round527_Div3_C題--Prefixes and Suffixes

Codeforces_Round527_Div3_C題--Prefixes and Suffixes

樣例

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");
        }
    }
}