Advertisement
Guest User

Untitled

a guest
Jan 7th, 2016
228
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.67 KB | None | 0 0
  1. /*
  2. Farsid
  3. BUET
  4. */
  5.  
  6. #include <bits/stdc++.h>
  7. using namespace std;
  8.  
  9. #define filer() freopen("far.in","r",stdin)
  10. #define filew() freopen("out.txt","w",stdout)
  11.  
  12. #define SET(a, x) memset((a), (x), sizeof(a))
  13. #define ll long long
  14. #define pb push_back
  15. #define mp make_pair
  16. #define all(x) (x).begin(),(x).end()
  17. #define SZ(x) ((int)(x).size())
  18. #define i64 ll
  19. #define IN(A, B, C) ((B) <= (A) && (A) <= (C))
  20. #define MAX
  21. #define xx first
  22. #define yy second
  23.  
  24. typedef vector<int> VI;
  25. typedef vector<string> VS;
  26. typedef vector<double> VD;
  27. typedef vector<ll> VL;
  28. typedef pair<int,int> PII;
  29. typedef pair<ll,ll> PLL;
  30. const int inf=0x20202020;
  31. //const ll mod=1000000007;
  32. const double eps=1e-9;
  33. const double pi=3.1415926535897932384626;
  34.  
  35. const int DX[]={1,0,-1,0},DY[]={0,1,0,-1};
  36. //ll powmod(ll a,ll b) {ll res=1;a%=mod;for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
  37. ll powmod(ll a,ll b,ll mod) {ll res=1;a%=mod;for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
  38. ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;}
  39.  
  40.  
  41. template<class X>void debug(vector<X>&v){for(int i=0;i<v.size();i++)cout<<v[i]<<" ";cout<<endl;}
  42.  
  43.  
  44. // multiplying primes
  45. i64 p[3];
  46.  
  47. // prime mods
  48. i64 mod[3];
  49.  
  50. i64 H1[100009],HR1[100009],H2[100009],HR2[100009];
  51.  
  52.  
  53. int main()
  54. {
  55. //filer();
  56. //freopen("far.in","r",stdin);
  57. //freopen("gadha.out","w",stdout);
  58. int i,j,k ,T,cas=0;
  59. p[0]=29;
  60. p[1]=37;
  61. mod[0]=1000000007;
  62. mod[1]=1000000009;
  63.  
  64. scanf("%d",&T);
  65. while(T--){
  66. string s;
  67. cin>>s;
  68. H1[0]=s[0]%mod[0];
  69. H2[0]=s[0]%mod[1];
  70. int j=s.size();
  71. int sz=j;
  72. HR1[0]=((s[0]%mod[0])*powmod(p[0],--j,mod[0]))%mod[0];
  73. HR2[0]=((s[0]%mod[1])*powmod(p[1],j,mod[1]))%mod[1];
  74.  
  75. for(i=1;i<sz;i++){
  76. //H1 H2
  77. H1[i]=((s[i]%mod[0])*powmod(p[0],i,mod[0]))%mod[0];
  78. H2[i]=((s[i]%mod[1])*powmod(p[1],i,mod[1]))%mod[1];
  79. H1[i]=(H1[i-1]+H1[i])%mod[0];
  80. H2[i]=(H2[i-1]+H2[i])%mod[1];
  81.  
  82. HR1[i]=((s[i]%mod[0])*powmod(p[0],--j,mod[0]))%mod[0];
  83. HR2[i]=((s[i]%mod[1])*powmod(p[1],j,mod[1]))%mod[1];
  84.  
  85. HR1[i]=(HR1[i-1]+HR1[i])%mod[0];
  86. HR2[i]=(HR2[i-1]+HR2[i])%mod[1];
  87.  
  88. }
  89.  
  90. // cout<<H1[sz-1]<<" "<<HR1[sz-1]<<endl;
  91. // cout<<H2[sz-1]<<" "<<HR2[sz-1]<<endl;
  92.  
  93.  
  94. i64 h1,h2,hr1,hr2;
  95. int cnt=0;
  96. if(sz & 1){
  97. int mid=sz/2;
  98. h1=H1[mid-1];
  99. h2=H2[mid-1];
  100. hr1=(HR1[sz-1]-HR1[mid]+mod[0])%mod[0];
  101. hr2=(HR2[sz-1]-HR2[mid]+mod[1])%mod[1];
  102. if(h1==hr1 && h2==hr2)cnt+=2;
  103. for(i=0;i<sz;i++){
  104. h1=-1,h2=-2,hr1=-3,hr2=-4;
  105. if(i==mid)continue;
  106. if(i<mid){
  107. hr1=(HR1[sz-1]-HR1[mid]+mod[0])%mod[0];
  108. hr2=(HR2[sz-1]-HR2[mid]+mod[1])%mod[1];
  109. h1=h2=0;
  110. if(i){
  111. h1=H1[i-1];
  112. h2=H2[i-1];
  113. }
  114. i64 a=(H1[mid]-H1[i]+mod[0])%mod[0];
  115. a*=powmod(p[0],mod[0]-2,mod[0]);
  116.  
  117. i64 b=(H2[mid]-H2[i]+mod[1])%mod[1];
  118. b*=powmod(p[1],mod[1]-2,mod[1]);
  119.  
  120. a%=mod[0];
  121. b%=mod[1];
  122. h1=(h1+a)%mod[0];
  123. h2=(h2+b)%mod[1];
  124. }
  125. else{
  126. h1=h2=0;
  127. if(mid){
  128. h1=H1[mid-1];
  129. h2=H2[mid-1];
  130. }
  131.  
  132. hr1=(HR1[sz-1]-HR1[i]+mod[0])%mod[0];
  133. hr2=(HR2[sz-1]-HR2[i]+mod[1])%mod[1];
  134. i64 a=(HR1[i-1]-HR1[mid-1]+mod[0])%mod[0];
  135. i64 b=(HR2[i-1]-HR2[mid-1]+mod[1])%mod[1];
  136. a*=powmod(p[0],mod[0]-2,mod[0]);
  137. b*=powmod(p[1],mod[1]-2,mod[1]);
  138. a%=mod[0];
  139. b%=mod[1];
  140. hr1=(hr1+a)%mod[0];
  141. hr2=(hr2+b)%mod[1];
  142. }
  143. if(h1==hr1 && h2==hr2)cnt++;
  144. }
  145. }
  146. else {
  147. int mid;
  148. mid=sz/2;
  149. h1=H1[mid-1];
  150. hr1=(HR1[sz-1]-HR1[mid-1]+mod[0])%mod[0];
  151. h2=H2[mid-1];
  152. hr2=(HR2[sz-1]-HR2[mid-1]+mod[1])%mod[1];
  153. if(h1==hr1 && h2==hr2)cnt++;
  154. for(i=0;i<sz;i++){
  155. h1=-1,h2=-2,hr1=-3,hr2=-4;
  156. if(i<mid){
  157. hr1=(HR1[sz-1]-HR1[mid]+mod[0])%mod[0];
  158. hr2=(HR2[sz-1]-HR2[mid]+mod[1])%mod[1];
  159. if(i){
  160. h1=H1[i-1];
  161. h2=H2[i-1];
  162. }
  163. else {
  164. h1=0;
  165. h2=0;
  166. }
  167. i64 a=(H1[mid-1]-H1[i]+mod[0])%mod[0];
  168. a*=powmod(p[0],mod[0]-2,mod[0]);
  169. i64 b=(H2[mid-1]-H2[i]+mod[1])%mod[1];
  170. b*=powmod(p[1],mod[1]-2,mod[1]);
  171. a%=mod[0];
  172. b%=mod[1];
  173. h1=(h1+a)%mod[0];
  174. h2=(h2+b)%mod[1];
  175. }
  176. else{
  177. //mid--;
  178. int x=mid-1;
  179. h1=h2=0;
  180. if(x){
  181. h1=H1[x-1];
  182. h2=H2[x-1];
  183. }
  184. hr1=(HR1[sz-1]-HR1[i]+mod[0])%mod[0];
  185. hr2=(HR2[sz-1]-HR2[i]+mod[1])%mod[1];
  186. i64 a=(HR1[i-1]-HR1[x]+mod[0])%mod[0];
  187. i64 b=(HR2[i-1]-HR2[x]+mod[1])%mod[1];
  188. a*=powmod(p[0],mod[0]-2,mod[0]);
  189. b*=powmod(p[1],mod[1]-2,mod[1]);
  190. a%=mod[0];
  191. b%=mod[1];
  192. hr1=(hr1+a)%mod[0];
  193. hr2=(hr2+b)%mod[1];
  194. }
  195. if(h1==hr1 && h2==hr2)cnt++;
  196. }
  197. }
  198. printf("%d\n",cnt);
  199. }
  200. return 0;
  201. }
  202. /*Test Cases
  203.  
  204.  
  205. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement