POJ-3087 Shuffle'm Up 【暴力+STL】
阿新 • • 發佈:2018-11-01
題目:t組資料,給出長度為n的初始字串s1,s2,和長度為2n的目標字串p,按題目要求操作,問s1,s2達到字串p的最小運算元,若達不到則輸出-1;輸出時首先輸出資料組數。
題解:直接用字串模擬,用map記錄該狀態是否被訪問過,如果被訪問過則說明出現迴圈,到達不了目標狀態。
補充:用map<string,int> mp;記錄某一狀態是否被訪問過;
string中的s.substr(int a,int n)函式:從s字串複製一個從a位置開始,並具有n長度的子字串
AC程式碼:
#include <iostream> #include <algorithm> #include <cstdio> #include <cstring> #include <string> #include <cmath> #include <queue> #include <stack> #include <vector> #include <map> #include <set> using namespace std; #define io ios::sync_with_stdio(0),cin.tie(0) #define ms(arr) memset(arr,0,sizeof(arr)) #define inf 0x3f3f3f typedef long long ll; const int mod=1e9+7; const int maxn=1e5+7; int t,n; string s1,s2,s,p; map <string,int> mp; int main() { io; cin>>t; for(int o=1;o<=t;o++) { cin>>n; cin>>s1>>s2>>p; int ans=0; while(1) { ans++; s=""; for(int i=0;i<n;i++) s=s+s2[i]+s1[i]; if(mp[s]) { ans=-1; break; } else if(s==p) { break; } else { mp[s]=1; s1=s.substr(0,n); s2=s.substr(n,n); } } cout<<o<<" "<<ans<<endl; } return 0; }