Advertisement
despotovski01

Ubavi stringovi

May 10th, 2017
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.47 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstring>
  3. using namespace std;
  4.  
  5. const int MAX_LEN = 2010;
  6. const int mod = 1000000007;
  7. /// vo ways se cuva na kolku razlicni nacini moze da se napravi palindrom so neparen broj karakteri od dvata podstringa, so centar pomegju dvete dimenzii
  8. /// primer: ways[left][right][1] cuva na kolku razlicni nacini moze da se napravi palindrom od podstringovite [1, left] i [right, n] so centar i vo [left+1, right-1],
  9. /// i pritoa koga ja pomestuvame levata granica mozeme da broime
  10. /// tretata dimenzija e za da vodime smetka da ne broime isti palindromi poveke pati
  11. int ways[MAX_LEN][MAX_LEN][2];
  12. /// tuka go cuvame stringot od vlezot
  13. char s[MAX_LEN];
  14.  
  15. void run(){
  16.     cin>>s;
  17.     int n = strlen(s);
  18.     for(int left = 0;left < n;++left){ /// Odime za sekoja leva granica. Ako left == 0, togas sme nadvor od stringot.
  19.         for(int right = n+1;right > left+1;--right){ /// Odime za sekoja desna granica. Ako right == n+1, togas sme nadvor od stringot.
  20.             for(int shouldAdd = 0;shouldAdd < 2;++shouldAdd){ /// Pomosnoto znamence za broenje.
  21.                 if(left == 0 || right == n+1){
  22.                     /// Nadvor od granicite. Ako smeeme da broime, imame nov palindrom, i dodadi go.
  23.                     ways[left][right][shouldAdd] = shouldAdd;
  24.                 } else {
  25.                     /// Pomesti desna granica, i iskluci broenje ako se stigne do kraj
  26.                     int val = ways[left][right+1][0];
  27.                     if(shouldAdd){
  28.                         /// Ako smeeme da broime, pomesti se levo i dodadi gi palindromite
  29.                         val = (val + ways[left-1][right][1]) % mod;
  30.                     }
  31.                     if(s[left-1] == s[right-1]){
  32.                         /// Mozeme da sozdademe nov palindrom. Dodadi gi site palindromi sto mozeme posle segasniot da gi sozdademe.
  33.                         val = (val + ways[left-1][right+1][1]) % mod;
  34.                     }
  35.                     /// Postavi ja vrednosta vo ways
  36.                     ways[left][right][shouldAdd] = val;
  37.                 }
  38.             }
  39.         }
  40.     }
  41.     /// Krajniot rezultat
  42.     int res = 0;
  43.     for(int i = 1;i<=n;++i){
  44.         /// Za sekoj centar na palindrom i, presmetaj kolku vkupno takvi palindromi postojat.
  45.         res = (res + ways[i-1][i+1][1]) % mod;
  46.     }
  47.     /// Pecati go rezultatot
  48.     cout<<res<<endl;
  49. }
  50.  
  51. int main(){
  52.     ios::sync_with_stdio(false);
  53.     /// Povikaj ja resavackata funkcija.
  54.     run();
  55.     return 0;
  56. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement