codeforce 1055 problem D. Refactoring 貪心,暴力
阿新 • • 發佈:2018-12-22
點我看題
md 要被掛在恥辱柱上了。
題意:
題意很好懂,不講了。
解題思路:
很容易想到,對所有串找他必須要被替換的串。
看是否只有一個這樣的串。
然後再貪心的儘量往兩邊擴充套件。
然後在一個一個判斷是否可行(很重要,wa了20發的教訓)
雖然說起來很簡單,但其實寫起來很蛋疼。
wa到我 想原地退役
ps:資料其實不是很強 找串的時候可以直接find(),沒必要多謝一個kmp或者hash
寫了6個小時,心態都要炸了。
#include<bits/stdc++.h> #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 using namespace std; typedef unsigned long long ULL; const int MAX= 5005; int n; string strs[MAX]; string strp[MAX]; int anspos = 0; int strlens[MAX]; int vis[MAX]; int change[MAX][2]; string ansa,ansb; bool cal(int pos){ int len = strs[pos].size(); strlens[pos]=len; int l=-1,r=len; while(l<len && strs[pos][++l]==strp[pos][l]); while(r>0 && strs[pos][--r]==strp[pos][r]); if(l>r) return 1; string cnt = strs[pos].substr(l,r-l+1); string cnt2 = strp[pos].substr(l,r-l+1); if(ansa.size()==0 && ansb.size()==0){ anspos = pos; ansa= cnt; ansb= cnt2; } //cout<<cnt<<" "<<strp[pos].substr(l,r-l+1)<<endl; if(cnt!=ansa || cnt2!=ansb){ return 0; } vis[pos]=1; change[pos][0]=l,change[pos][1]=r; return 1; } bool myfinds(string &ps){ int nowcntlen = ps.size(); for(int i=0;i<n;i++){ //if(vis[i]) continue; auto pos = strs[i].find(ps); if(pos!=string::npos){ string rester = strs[i].substr(0,pos)+ansb+strs[i].substr(pos + ansb.size()); if(rester != strp[i]){ return 1; } } } return 0; } int addl,addr; string pre; bool check(int len){ addl=0,addr=0; while(change[anspos][0]>0){ //cout<<change[anspos][0]<<endl; int flag =1; for(int i=0;i<n;i++){ if(i==anspos) continue; if(!vis[i]) continue; if(change[i][0]>0 && strs[anspos][change[anspos][0]-1]==strs[i][change[i][0]-1]){ change[i][0]--; }else{ flag = 0; break; } } if(flag){ change[anspos][0]--; addl++; }else{ break; } } while(change[anspos][1]<len-1){ int flag =1; for(int i=0;i<n;i++){ if(i==anspos) continue; if(!vis[i]) continue; //cout<<strs[anspos][change[anspos][1]+1]<<" "<<strs[i][change[i][1]+1]<<endl; if(change[i][1]<strlens[i]-1 && strs[anspos][change[anspos][1]+1]==strs[i][change[i][1]+1]){ change[i][1]++; }else{ flag = 0; //cout<<"alrt:"<<i<<endl; break; } } if(flag){ change[anspos][1]++; addr++; }else{ break; } } } int main(){ //freopen("out.txt","r",stdin); std::ios::sync_with_stdio(false); cin>>n; ansa.clear(),ansb.clear(); for(int i=0;i<n;i++){ cin>>strs[i]; } for(int i=0;i<n;i++){ cin>>strp[i]; } for(int i=0;i<n;i++){ if(!cal(i)){ cout<<"NO\n"; return 0; } } int nowl=change[anspos][0],nowr=change[anspos][1]; check(strs[anspos].size()); if(addl){ ansa=strs[anspos].substr(nowl-addl,addl)+ansa; ansb=strs[anspos].substr(nowl-addl,addl)+ansb; } if(addr){ ansa+=strs[anspos].substr(nowr+1,addr); ansb+=strs[anspos].substr(nowr+1,addr); } if(myfinds(ansa)){ cout<<"NO\n"; }else{ cout<<"YES\n"; cout<<ansa<<"\n"<<ansb<<endl; } return 0; }