Codeforces 1092C Prefixes and Suffixes(思维)
题意:给定未知字符串长度n,给出2n-2个字符串,其中n-1个为未知字符串的前缀(n-1个字符串长度从1到n-1),另外n-1个为未知字符串的后缀(n-1个字符串长度从1到n-1),判断这2n-2个字符串分别为前缀还是后缀。
题解:从2n-2从找个n-1长度的字符串和1长度的字符串拼接,判断该字符串是否符合要求,能作为未知字符串。符合的话,直接输出答案。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <set> 2 #include <map> 3 #include <queue> 4 #include <deque> 5 #include <stack> 6 #include <cmath> 7 #include <cstdio> 8 #include <vector> 9 #include <string> 10 #include <cstring> 11 #include <fstream> 12 #include <iostream> 13 #include <algorithm> 14 using namespace std; 15 16 #define eps 1e-8 17 #define pb push_back 18 #define PI acos(-1.0) 19 #define INF 0x3f3f3f3f 20 #define clr(a,b) memset(a,b,sizeof(a) 21 #define FAST_IO ios::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL) 22 23 typedef long long ll; 24 typedef unsigned long long ull; 25 int n,m; 26 string str[234]; 27 map <string,int> M; 28 29 void solve(string s){ 30 for(int i=1;i<=m;i++){ 31 bool ok=0; 32 int sz=str[i].size(); 33 if(s.substr(0,sz)==str[i]) ok=1; 34 if(s.substr(n-sz)==str[i]) ok=1; 35 if(!ok) return ; 36 } 37 for(int i=1;i<=m;i++){ 38 int sz=str[i].size(); 39 if(s.substr(0,sz)==str[i]&&s.substr(n-sz)==str[i]){ 40 if(M[str[i]]) cout<<"S",M[str[i]]=0; 41 else cout<<"P",M[str[i]]=1; 42 } 43 else if(s.substr(n-sz)==str[i]) cout<<"S"; 44 else if(s.substr(0,sz)==str[i]) cout<<"P"; 45 } 46 cout<<endl; 47 exit(0); 48 } 49 50 int main(){ 51 FAST_IO; 52 cin>>n; 53 m=2*n-2; 54 for(int i=1;i<=m;i++) cin>>str[i]; 55 for(int i=1;i<=m;i++){ 56 for(int j=1;j<=m;j++){ 57 if(str[i].size()==n-1&&str[j].size()==1) 58 solve(str[i]+str[j]); 59 } 60 } 61 return 0; 62 }