a53

origami_ANDR

a53
Feb 25th, 2019
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.47 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4. ifstream fin("origami.in");
  5. ofstream fout("origami.out");
  6.  
  7. vector<string> arr, aux;
  8. string str;
  9. vector<int> dp[4], mnm[4], Long;
  10.  
  11. void findLongest(int n)
  12. {
  13. Long.resize(n+1);
  14. for(int i=1, m=0, l=0, r=0; i<=n; i++)
  15. {
  16. if(i>r)
  17. {
  18. Long[i]=1;
  19. l=r=m=i;
  20. while(l>1 && r<n && str[l-1]==str[r + 1])
  21. {
  22. Long[i]++;
  23. l--;
  24. r++;
  25. }
  26. }
  27. else
  28. {
  29. int p=m-(i-m);
  30. if(p-Long[p]+1>l)
  31. Long[i]=Long[p];
  32. else
  33. {
  34. Long[i]=p-l+1;
  35. l=i-Long[i]+1;
  36. m=i;
  37. while(l>1 && r<n && str[l-1]==str[r + 1])
  38. {
  39. Long[i]++;
  40. l--;
  41. r++;
  42. }
  43. }
  44. }
  45. }
  46. for(int i=1; i<=n; i++)
  47. {
  48. if(str[i-Long[i]+1]=='#')
  49. Long[i]--;
  50.  
  51. Long[i]=(Long[i]+(i%2))/2;
  52.  
  53. }
  54. return;
  55. }
  56.  
  57. int main()
  58. {
  59. int n, m;
  60. fin>>n>>m;
  61. arr.resize(n);
  62. for(string &axs : arr)
  63. fin>>axs;
  64. for(int k=0; k<=3; k++)
  65. {
  66. mnm[k].assign(n, numeric_limits<int> :: max());
  67. dp[k].resize(n);
  68. str.resize(n*2);
  69. dp[k][0]=1;
  70. for(int i=0; i<=n*2-1; i++)
  71. str[i]='#';
  72. for(int j=0; j<=m-1; j++ )
  73. {
  74. for(int i=0, t=1; i<=n-1; i++, t+= 2)
  75. str[t] = arr[i][j];
  76. findLongest(n*2-1);
  77. for(int i=1; i<=n-1; i++ )
  78. mnm[k][i]=min(mnm[k][i], Long[i*2]);
  79. }
  80. for(int i=1; i<=n-1; i++)
  81. dp[k][i]=dp[k][i-1]+(dp[k][i-1]-((i-mnm[k][i]-1<0) ? 0 : dp[k][i-mnm[k][i]-1])>=1);
  82. aux.resize(m);
  83. for(string &axs : aux)
  84. axs.clear();
  85. for(int i=n-1; i>=0; i--)
  86. for(int j=0; j<=m-1; j++)
  87. aux[j].push_back(arr[i][j]);
  88. swap(n,m);
  89. arr=aux;
  90. if(k>=2)
  91. {
  92. reverse(dp[k].begin(), dp[k].end());
  93. reverse(mnm[k].begin(), mnm[k].end());
  94. }
  95. }
  96. long long sol=0;
  97. for(int i=0; i<=n-1; i++)
  98. for(int j=0; j<=m-1; j++)
  99. if((i==0 || dp[0][i]-dp[0][i-1]==1) && (j==0 || dp[1][j]-dp[1][j-1]==1))
  100. sol +=dp[2][i]*dp[3][j];
  101. fout<<sol<<'\n';
  102. return 0;
  103.  
  104. }
Add Comment
Please, Sign In to add comment