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