NC227321. 进击的图灵机
描述
输入描述
输入第一行包含两个整数,表示纸带长度与执行命令次数。
第二行是一个长为的字符串,表示你手中的纸带,保证该字符串中只含有大写的。
接下来行,每行两个数字,表示这次执行命令读取的是纸带上第个字母到第个字母之间(含端点)的部分。
输出描述
输出行,每行一个非负整数,表示在这一次命令中,图灵机回到过多少次坐标原点。
示例1
输入:
7 6 UUDLRDU 1 3 2 5 4 7 1 6 6 7 7 7
输出:
0 2 2 1 1 0
C++ 解法, 执行用时: 245ms, 内存消耗: 8908K, 提交时间: 2022-04-05 17:24:31
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=2e5+10; char s[N]; pair<int,int> v[N]; map<pair<int,int>,vector<int>> mp; int main(){ int n,m; scanf("%d%d",&n,&m); scanf("%s",s+1); int x=0,y=0; for(int i=1;i<=n;i++){ if(s[i]=='U') y++; if(s[i]=='D') y--; if(s[i]=='L') x--; if(s[i]=='R') x++; v[i]={x,y}; mp[{x,y}].push_back(i); } while(m--){ int l,r; scanf("%d%d",&l,&r); vector<int> &t=mp[v[l-1]]; auto st=lower_bound(t.begin(),t.end(),l); auto ed=upper_bound(t.begin(),t.end(),r); printf("%d\n",ed-st); } return 0; }