|
|
back to boardWA22 #include <limits> #include <fstream> #include <algorithm> #include <set> #include <map> #include <sstream> #include <string> #include <vector> #include <cmath> #include <time.h> #include <cmath> #define fori(i,n) for(int i=0;i<n;i++) #define for1(i,n) for(int i=1;i<=n;i++) #define forbi(i,a,b) for(int i = a; i<=b; i++) #define len(v) (int((v).size())) #define vi vector<int> #define vvi vector<vi > #define sz(v) (int)v.size() #define mmin(a,b,c) min(a,min(b,c)) #define sqr(x) ((x)*(x)) #define all(v) v.begin(),v.end() #define inf 987654321 #define mmax(a,b,c) max(a,max(b,c)) #define ii pair<int,int> #define si pair<int,string> #define sii vector<si > #define vii vector<ii > #define vs vector<string > #define vvii vector<vii > const double pi = acos(0.0)*2; const double eps = 1e-7; #define mp(a,b) make_pair(a,b) using namespace std; #ifndef ONLINE_JUDGE ifstream cin("input.txt"); ofstream cout("output.txt"); #else #include <iostream> #endif vii X; vii Z; vi V; vi U; vector < char > S; void main() { V.reserve(200001); char T [200001]; X.reserve(200001); Z.reserve(200001); U.reserve(200001);
int n; scanf("%s", T); scanf("%d",&n); int t=strlen(T); X=vii(n); V.resize(t); Z=vii(t);
fori(i,n) scanf("%d%d",&(X[i].first),&(X[i].second)); int y=0, max=0, Root=0, c=1; U.resize(t); S.reserve(200001); fori(i,t) { if (S.empty() && (T[i]=='a' || T[i]=='c' || T[i]=='g' || T[i]=='t')) { V[i]=1; Z[i].second=Root; if (i!=0) Z[i].first=Z[i-1].second; continue; } if (T[i]=='A' || T[i]=='C' || T[i]=='G' || T[i]=='T') { S.push_back(T[i]); if (i!=0) Z[i].first=Z[i-1].second; y++; if (y>max) max=y; Z[i].second=y+c; } else { if (S.back() - T[i] == 'A' - 'a') { S.pop_back(); y--; Z[i].second=y+c; Z[i].first=Z[i-1].second; if (S.empty()) { Z[i].second=Root; y=Root; c++; }
} else { V[i]=1; Z[i].first=Z[i-1].second; S.clear(); Root=max+1; Z[i].second=Root; c++; y=Root; } } } /* fori(i,t) cout<<V[i].first<<" "; cout<<endl; fori(i,t) cout<<V[i].second<<" "; */
//V.push_back(mp(0,0)); U[0]=V[0]; for(int i=1; i<t; i++) U[i]=U[i-1]+V[i]; fori(j,n) { int d; if (X[j].first>1) d=U[X[j].second-1]-U[X[j].first-2]; else d=U[X[j].second-1];
if ((Z[X[j].first-1].first==Z[X[j].second-1].second) && d==0) printf("%d",1); else printf("%d",0); } } |
|
|