Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
37745 | LYLAKIOI | 【BJ】T3 | C++ | 解答错误 | 91 | 205 MS | 27248 KB | 4542 | 2025-05-07 18:36:00 |
#include<bits/stdc++.h> #include<bits/extc++.h> #define up(i,l,r) for(int i=(l);i<=(r);++i) #define down(i,l,r) for(int i=(l);i>=(r);--i) #define p1 first #define p2 second #define m_p make_pair #define p_b push_back using namespace std; using namespace __gnu_pbds; typedef long long ll; const int maxn=1e5+10,mod=998244353; inline ll read(){ ll x=0;short t=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')t=-1;ch=getchar();} while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); return x*t; } int n; string s; struct ODT { set<pair<ll,ll> >s; void ins(ll l,ll r){ auto it=s.lower_bound(m_p(l,l-1)); vector<pair<ll,ll> >del; int L=l,R=r; if(it!=s.begin()){ it--; if((*it).p2>=l)del.p_b(*it),L=(*it).p1,it++; else it++; } while(it!=s.end()){ if((*it).p1>r)break; if((*it).p2<=r)del.p_b(*(it++)); else { del.p_b(*it);R=(*it).p2; break; } } for(auto it:del)s.erase(it); s.insert(m_p(L,R)); } }; map<pair<ll,ll>,ODT>mp; inline int fl(int a,int b){if(a>=0||a%b==0)return a/b;return a/b-1;} inline int md(int a,int b){return a-fl(a,b)*b;} void slv(){ read();n=read();cin>>s; int sx=0,sy=0; for(char ch:s){ if(ch=='E')sx++; if(ch=='W')sx--; if(ch=='N')sy++; if(ch=='S')sy--; } auto force=[](){ auto g=[](ll u,char c){ if(c=='E')return u+1; if(c=='W')return u-1; if(c=='N')return u+mod; return u-mod; }; unordered_set<ll>mp; ll p=0; mp.insert(p); for(char c:s){ p=g(p,c); mp.insert(p); } int res=0; for(auto it:mp){ bool ok=1; for(ll d:{1,mod,mod+1})ok&=mp.count(it+d); res+=ok; } return res; }; if((!sx)&&(!sy))return cout<<force(),void(); if(!sx){ for(char &ch:s){ if(ch=='E')ch='N'; else if(ch=='W')ch='S'; else if(ch=='N')ch='E'; else ch='W'; } swap(sx,sy); } if(sx<0){ for(char &ch:s){ if(ch=='E')ch='W'; else if(ch=='W')ch='E'; }sx=-sx; } auto ins=[&](int x,int y,int _n){ int p=fl(x,sx); mp[m_p(x-p*sx,y-p*1ll*sy)].ins(p,p+_n-1); }; ins(0,0,n+1); int x=0,y=0; up(i,0,(int)s.size()-2){ char ch=s[i]; if(ch=='E')x++; if(ch=='W')x--; if(ch=='N')y++; if(ch=='S')y--; ins(x,y,n); } auto solve=[&](int x,int y){ int p=fl(x,sx); vector<pair<ll,ll> >vec; if(!mp.count(m_p(x-p*sx,y-p*1ll*sy)))return (vector<pair<ll,ll> >){}; for(auto it:mp[m_p(x-p*sx,y-p*1ll*sy)].s)vec.p_b(m_p(it.p1-p,it.p2-p)); return vec; }; auto get=[](vector<ll>a,vector<ll>b){ vector<ll>c;int j=0; up(i,0,(int)a.size()-1){ while(j<b.size()&&b[j]<=a[i])c.p_b(b[j++]); c.p_b(a[i]); } while(j<b.size())c.p_b(b[j++]); return c; }; auto merge=[&](vector<pair<ll,ll> >v1,vector<pair<ll,ll> >v2){ vector<ll>A,B; for(auto it:v1)A.p_b(it.p1-1),A.p_b(it.p2); for(auto it:v2)B.p_b(it.p1-1),B.p_b(it.p2); vector<ll>C=get(A,B); C.erase(unique(C.begin(),C.end()),C.end()); vector<int>tag1(C.size()+5,0),tag2(C.size()+5,0); int rk=0; for(auto it:v1){ while(C[rk]<it.p1-1)rk++; int l=rk; while(C[rk]<it.p2)rk++; up(i,l+1,rk)tag1[i]=1; }rk=0; for(auto it:v2){ while(C[rk]<it.p1-1)rk++; int l=rk; while(C[rk]<it.p2)rk++; up(i,l+1,rk)tag2[i]=1; } vector<pair<ll,ll> >ans; up(i,1,(int)C.size()-1)if(tag1[i]&&tag2[i])ans.p_b(m_p(C[i-1]+1,C[i])); return ans; }; ll res=0; for(auto it:mp){ int x=it.p1.p1,y=it.p1.p2; vector<pair<ll,ll> >ans=merge(merge(solve(x,y),solve(x,y+1)),merge(solve(x+1,y),solve(x+1,y+1))); for(auto it:ans)res+=it.p2-it.p1+1; } cout<<res; } int main(){ //freopen("resist.in","r",stdin),freopen("resist.out","w",stdout); slv(); return 0; }