题意:
一个长度为n的字符串s,给出2*n-2个字符串,这些是s的所有前缀和后缀。问给出个2*n-2个字符串,哪个是前缀,哪个是后缀。
若有多解,输出任意一个均可。
题解:
1.将2*n-2个字符串按照长度从小到大排序,结构体存储字符串和字符串的原输入位置。
2.将长度为1和长度为n-1的字符串拼接起来,共有四种情况。(长度为1或长度为n-1在前一样,大不了前后缀互换)
3.将2*n-2个字符串与这个字符串匹配。
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<vector>
#include<stack>
#define N 200005
#define mod 1000000007
using namespace std ;
int n ;
char c[105] ;
struct node
{
char s[105] ;
int id ;
} a[205] ;
bool cmp(node x , node y)
{
return strlen(x.s) < strlen(y.s) ;
}
void solve()
{
int i , j ;
int num[205] ;
bool flag ;
char ans[205] ;
memset(num , 0 , sizeof(num)) ;
for(i = 1 ; i <= 2 * n - 2 ; i ++)
{
flag = 1 ;
for(j = 0 ; j < strlen(a[i].s) ; j ++)
{
if(a[i].s[j] != c[j])
{
flag = 0 ;
break ;
}
}
if(flag && num[strlen(a[i].s)] == 0)
{
num[strlen(a[i].s)] = 1 ;
ans[a[i].id] = 'P' ;
continue ;
}
flag = 1 ;
for(j = 0 ; j < strlen(a[i].s) ; j ++)
{
if(a[i].s[j] != c[j + strlen(c) - strlen(a[i].s)])
{
flag = 0 ;
break ;
}
}
if(flag)
{
ans[a[i].id] = 'S' ;
continue ;
}
else
return ;
}
for(i = 1 ; i <= 2 * n - 2 ; i ++)
printf("%c" , ans[i]) ;
exit(0) ;
}
int main()
{
int i , j ;
scanf("%d" , &n) ;
for(i = 1 ; i <= 2 * n - 2 ; i ++)
{
scanf("%s" , a[i].s) ;
a[i].id = i ;
}
sort(a + 1 , a + 2 * n - 1 , cmp) ;
for(i = 1 ; i <= 2 ; i ++)
for(j = 2 * n - 3 ; j <= 2 * n - 2 ; j ++)
{
strcpy(c , a[i].s) ;
strcat(c , a[j].s) ;
solve() ;
}
}