标记走过点的次数,该点的连续子序列为次数减一
累加即可得到正解
#include<bits/stdc++.h>
#include<string>
using namespace std;
typedef long long ll;
using namespace std;
#define inf 0x3f3f3f3f
const int N=1e5+10;
map<pair<int,int>,int>a;
int main(){
int n;
int t;
scanf("%d",&t);
while(t--)
{
ll sum=0;
scanf("%d",&n);
char s[N];
scanf("%s",s);
a.clear();
int x=0,y=0;
pair<int,int> c(x,y);
a[c]=1;
ll ans=1;
for(int i=0;i<n;i++)
{
if(s[i]=='U')
{
x++;
pair<int,int> c(x,y);
//cout<<a[c]<<" "<<x<<" "<<y<<" "<<s[i]<<endl;
sum+=a[c];
a[c]++;
}
if(s[i]=='D')
{
x--;
pair<int,int> c(x,y);
//cout<<a[c]<<" "<<x<<" "<<y<<" "<<s[i]<<endl;
sum+=a[c];
a[c]++;
}
if(s[i]=='L')
{
y--;
pair<int,int> c(x,y);
//cout<<a[c]<<" "<<x<<" "<<y<<" "<<s[i]<<endl;
sum+=a[c];
a[c]++;
}
if(s[i]=='R')
{
y++;
pair<int,int> c(x,y);
// cout<<a[c]<<" "<<x<<" "<<y<<" "<<s[i]<<endl;
sum+=a[c];
a[c]++;
}
}
cout<<sum<<endl;
}
return 0;
}