C. Prefixes and Suffixes (string函数)

版权声明:转载注明下出处就行了。 https://blog.csdn.net/LJD201724114126/article/details/85094565

题目链接:https://codeforces.com/contest/1092/problem/C

题意:给你2*n-2的字符子串,每个子串要么是前缀,要么是后缀,让你从中猜出来。

题解:我们直接找最长的两个子串,显然由这两个能推出整个串。

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<iostream>

using namespace std;

bool book[200];
string s[200];

int main()
{
    int n;

//    ios::sync_with_stdio(0);

    while(~scanf("%d",&n))
    {
        string s1="q",s2="r",P;

        for(int i=1;i<=2*n-2;i++){
            cin>>s[i];
            if(s1.size()<s[i].size()) s1=s[i]; ///找到最长的两个子串
            else if(s1.size()==s[i].size()) s2=s[i];
        }

        int num=0;

        for(int i=1;i<=2*n-2;i++){
            if(s1.substr(0,s[i].size())==s[i]){
                if(s[i]!=s2) ++num;
            }
        }

        ///假设超过一半,且s1的最长后缀等于s2的最长前缀,说明s1是前缀
        if(num>=(2*n-2)/2&&s1.substr(1,s1.size()-1)==s2.substr(0,s2.size()-1))
            P=s1;
        else P=s2;

        memset(book,true,sizeof(book));

        for(int i=1;i<=2*n-2;i++)
        {
            if(P.substr(0,s[i].size())==s[i]&&book[s[i].size()]){
                printf("P");
                book[s[i].size()]=0;
            }
            else
                printf("S");
        }
        puts("");


    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/LJD201724114126/article/details/85094565