fork download
  1. /*
  2. --------------------------------DO NOT COPY I REQUEST YOU PLEASE--------------------------
  3.  
  4. AUTHOR : Chandan Agrawal
  5. College : Poornima College of Engg. jaipur, Raj
  6. Mail : chandanagrawal23@gmail.com
  7.  
  8. */
  9.  
  10. #include<bits/stdc++.h>
  11. #include<stdio.h>
  12. using namespace std;
  13.  
  14. #define fastio ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
  15. #define MAX 100050
  16.  
  17. #define ll long long
  18. #define ld long double
  19. #define lli int
  20.  
  21. #define pb emplace_back
  22. #define INF 1000000000
  23. #define mod 1000000007
  24. #define MOD 1000000007
  25.  
  26. // trignometric function always give value in Radians only
  27. #define PI acos(-1) //3.1415926535897932384626433832795028
  28. #define dsin(degree) sin(degree*(PI/180.0))
  29. #define dcos(degree) cos(degree*(PI/180.0))
  30. #define dtan(degree) tan(degree*(PI/180.0))
  31.  
  32. #define rsin(radian) sin(radian)
  33. #define rcos(radian) cos(radian)
  34. #define rtan(radian) tan(radian)
  35.  
  36. #define loop(i,n) for (lli i = 0; i < n; i++)
  37. #define loopitr(xt,vec) for (auto xt : vec)
  38. #define FOR(i,a,b) for (lli i = a; i < b; i+=1)
  39. #define loop_rev(i,n) for (lli i = n-1; i >= 0; i--)
  40. #define FOR_REV(i,a,b) for (lli i = a; i >= b; i--)
  41. #define itr :: iterator it
  42. #define WL(t) while(t --)
  43.  
  44. #define all(v) v.begin(),v.end()
  45. #define makeuniq(v) v.resize(unique(all(v)) - v.begin()); //only uniq element in vector after this
  46. #define sz(x) int(x.size())
  47. #define F first
  48. #define S second
  49.  
  50. #define mii map<lli,lli>
  51. #define vi vector<lli>
  52. #define seti set<lli>
  53. #define pii pair<lli,lli>
  54.  
  55. #define gcd(a,b) __gcd((a),(b))
  56. #define lcm(a,b) (a/gcd(a,b))*b
  57. #define abs(x) ((x < 0)?-(x):x)
  58.  
  59. template <typename T>
  60. void print(T x){cout<<x<<endl;}
  61. template <typename T1, typename T2>
  62. void print2(T1 x,T2 y){cout<<x<<" "<<y<<endl;}
  63. template <typename T1, typename T2,typename T3>
  64. void print3(T1 x, T2 y,T3 z){cout<<x<<" "<<y<<" "<<z<<endl;}
  65.  
  66. #define scanarr(a,n) for(lli i=0;i<n;i++) cin>>a[i];
  67. #define scanvector(a,n) for(lli i=0;i<n;i++){ lli x ; cin>>x; a.push_back(x);}
  68.  
  69. #define printarr(a,n) for(lli i=0;i<n;i++) cout<<a[i]<<" "; cout<<endl;
  70. #define printvector(vec) for(auto xt : vec) cout<<xt<<" "; cout<<"\n";
  71. #define printset(st) for(auto xt : st) cout<<xt<<" "; cout<<"\n";
  72.  
  73. #define FD(N) fixed<<setprecision(N)
  74.  
  75. #define endl '\n'
  76.  
  77. #define deb(x) cout<<#x<<" "<<x<<endl;
  78.  
  79. /*
  80. ifstream cinn("i3.txt");
  81. ofstream coutt("o3.txt");
  82. */
  83.  
  84.  
  85. bool isvowel(char v) { return (0x208222>>(v&0x1f))&1; }
  86.  
  87. lli mceil(lli a,lli b){
  88. if(a%b==0) return(a/b);
  89. else return(a/b +1);
  90. }
  91. lli mfloor(lli a,lli b){
  92. return(a/b);
  93. }
  94.  
  95. ll modmul(ll a, ll b) {
  96. return ((a%mod) * (b%mod)) % mod;
  97. }
  98.  
  99. ll modadd(ll a , ll b){
  100. return((a%mod)+(b%mod)+mod)%mod;
  101. }
  102.  
  103. ll modsub(ll a , ll b){
  104. return((a%mod) - (b%mod) + mod)%mod;
  105. }
  106.  
  107. lli fastexpo(lli a,lli b){
  108. a = a%mod;
  109. lli ans=1;
  110. while(b){
  111. if(b&1)
  112. ans=(ans*1ll*a)%mod;
  113. a=(a*1ll*a)%mod;
  114. b=b/2;
  115. }
  116. return ans;
  117. }
  118.  
  119.  
  120. /* -----------------------------------------------------HASHING-------------------------------------------------------------------*/
  121. /*
  122. some key points -
  123. 1. Use (long int) to remove TLE or Memory Limit issue
  124. 2. If still Wrong answer then may be collision occur , use p as bigger prime no. p : [31,53,107,209,4793]
  125. 3. use mod either 1e9+7
  126. 4 .If it still shows WA then surely collision occurs use Double Hashing
  127.   Double Hashing -
  128.   Make Prehash Array using two different p and mod so chances of collision is less
  129. 5. use pass by reference always
  130.  
  131.  
  132. */
  133.  
  134.  
  135. #define maxlen 2000005 //maximum length of string
  136.  
  137. lli pow_p[maxlen]; // p^i %m
  138. lli p_inv[maxlen]; // this is inverse_Mod(p^i) basically p^(-n) = [p^(-1) ]^n so calculate just p^(-1) and caluclate power
  139. // like inversemod(p^(-2)) = p^(-1) * p^(-1)
  140. void init(lli p, lli val)
  141. {
  142. pow_p[0]=1;
  143. p_inv[0]=1;
  144. lli pinv = fastexpo(p,mod-2);
  145. for(lli i=1;i<val;i++)
  146. {
  147. pow_p[i] = modmul(pow_p[i-1],p);
  148. p_inv[i] = modmul(p_inv[i-1],pinv);
  149. }
  150.  
  151. }
  152.  
  153. struct Hash{
  154. // 0 based indexing
  155. lli prehash[maxlen];
  156. // hash(s) = sigma(i=0 to n-1) s[i]*p^(i)
  157. // a->1 , b->2 , c->3 and so on
  158.  
  159.  
  160. void precomputehash(string &s){ //p can be any prime 19 , 31, 53,107 ...
  161.  
  162.  
  163. prehash[0]=(s[0]);
  164. for (lli i=1;i<sz(s);i++) {
  165. prehash[i]= modadd(prehash[i-1] , modmul((s[i]),pow_p[i]));
  166. }
  167. }
  168.  
  169. // hash[l..r] = ((hash[upto r] - hash[upto (l-1)] ) / P^l) % mod = ((hash[upto r] - hash[upto (l-1)] ) * modinv(P^l) )%mod
  170. lli gethash(lli l, lli r){
  171. if(l==0)
  172. return(prehash[r]%mod);
  173. else{
  174. lli ans = modsub(prehash[r],prehash[l-1]);
  175. ans = modmul(ans, p_inv[l]);
  176. return ans;
  177. }
  178. }
  179.  
  180. // hash value of all string means hash[0..(n-1)] // 0 based indexing
  181. lli totalhash(string &s){
  182. return(prehash[sz(s)-1]%mod);
  183. }
  184. };
  185.  
  186. /* -----------------------------------------------------HASHING-------------------------------------------------------------------*/
  187.  
  188. int main(){
  189. fastio
  190. lli t=1;
  191. //cin>>t;
  192.  
  193. while(t--) {
  194. lli n,q;
  195. cin>>n>>q;
  196. init(53,n);
  197. string s;
  198. cin>>s;
  199. Hash obj1,obj2;
  200. obj1.precomputehash(s);
  201. string rev = s;
  202. reverse(all(rev));
  203. obj2.precomputehash(rev);
  204. while(q--)
  205. {
  206. lli st , en;
  207. cin>>st>>en;
  208. --st;
  209. --en;
  210. if(obj1.gethash(st,en) == obj2.gethash(n-en-1,n-st-1))
  211. print("yes");
  212. else
  213. print("no");
  214.  
  215. }
  216. }
  217. return 0;
  218. }
  219.  
Success #stdin #stdout 0s 4368KB
stdin
7 3
jmwswmj
1 7
5 5
5 7
stdout
yes
yes
no