思路:求解子串的个数可以转化为求移动过程中经过的重复点的数量,每两次经过同一个点可构成一个子串,所以直接模拟,用二维mp记录走过的该点次数,每次加上mp[x][y]
注意答案可能会超过long long
ac代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
map<int,map<int,int>>mp;
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
mp.clear();
int n;
scanf("%d",&n);
int x=0,y=0;
mp[0][0]=true;
ll an=0;
char c;
for(int i=1;i<=n;++i)
{
scanf(" %c",&c);
if(c=='U')
y++;
else if(c=='R')
x++;
else if(c=='L')
x--;
else
--y;
//cout<<x<<" "<<y<<endl;
an+=mp[x][y];
mp[x][y]++;
}
printf("%lld\n",an);
}
}