UPCOJ 2679
第一个串是位置,然后第二个串可以随便跳着走,完事问可以到达的最多点数。
l是左儿子能到的点数,r是右儿子能到的点数。
不被提示一下真不好写。
#include <cstdio> #include <cstring> #include <vector> #include <cmath> #include <stack> #include <cstdlib> #include <queue> #include <map> #include <iostream> #include <algorithm> #include <bits/stdc++.h> #include <queue> using namespace std; const int N = 1e5+5; const int MOD = 21092013; char a[N],b[N],d[N]; int main() { int T,cas=0; scanf("%d",&T); while(T--) { scanf("%s%s",a,b); int la=strlen(a),lb=strlen(b),ddd=0; for(int i=0; i<la; ++i) { if(a[i]=='U')ddd = max(ddd-1,0); else d[ddd]=a[i],ddd++; } int ans=0,l=1,r=1; for(int i=0; i<lb; ++i) { if(b[i]=='U') { ddd--; if(ddd<0) { ddd=0; continue; } ans++; ans%=MOD; if(d[ddd]=='L') r++,r%=MOD; else l++,l%=MOD; } else if(b[i]=='L') { ans=(ans+l)%MOD; r=(r+l)%MOD; } else { ans=(ans+r)%MOD; l=(l+r)%MOD; } } printf("Case %d: %d\n",++cas,ans+1); } return 0; }