acm萌新,以后在这个博客更新和记录一些题目吧
cf 617C,本来以为这场div3能上分,结果t3卡住了,然后t4明明很简单但只扫了一眼......t3一直在想双指针,思路太沙雕
正解就是用一个map<pair<int,int>,int>记录最后到达当前位置的是第几个字符,想法就是如果现在到达的位置之前也到达过,那么这段就可以删掉。然后使得可以删掉的长度大小最小,并记录对应的posl,posr。
然后一些细节也弄了挺久,位置各种+1 -1的错...还是太菜了
贴个代码吧
#include<bits/stdc++.h> using namespace std; const int inf=200000+10; map<pair<int,int>,int> mp; //*** int main() { string s; int t,i,j,k,n,len,f,posl,posr; //freopen("617c.txt","r",stdin); cin>>t; while (t--) { int min=inf; pair<int,int> p=make_pair(0,0);//*** cin>>n;mp.clear(); cin>>s;len=s.length(); posl=-1;posr=-1; mp[{p.first,p.second}]=0; for (i=0;i<len;i++) { if (s[i]==‘U‘) p.second++; if (s[i]==‘D‘) p.second--; if (s[i]==‘R‘) p.first++; if (s[i]==‘L‘) p.first--; if (mp[{p.first,p.second}]!=0||(p.first==0&&p.second==0)) { k=i-mp[{p.first,p.second}]+1; if (k<min) { min=k; posl=mp[{p.first,p.second}]+1; posr=i+1; } } mp[{p.first,p.second}]=i+1; } if (posl==-1&&posr==-1) cout<<-1<<endl; else cout<<posl<<‘ ‘<<posr<<endl; } //fclose(stdin); return 0; }
原文:https://www.cnblogs.com/edmunds/p/12288502.html