Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cstring>
- using namespace std;
- const int MAX_LEN = 2010;
- const int mod = 1000000007;
- /// 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
- /// 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],
- /// i pritoa koga ja pomestuvame levata granica mozeme da broime
- /// tretata dimenzija e za da vodime smetka da ne broime isti palindromi poveke pati
- int ways[MAX_LEN][MAX_LEN][2];
- /// tuka go cuvame stringot od vlezot
- char s[MAX_LEN];
- void run(){
- cin>>s;
- int n = strlen(s);
- for(int left = 0;left < n;++left){ /// Odime za sekoja leva granica. Ako left == 0, togas sme nadvor od stringot.
- for(int right = n+1;right > left+1;--right){ /// Odime za sekoja desna granica. Ako right == n+1, togas sme nadvor od stringot.
- for(int shouldAdd = 0;shouldAdd < 2;++shouldAdd){ /// Pomosnoto znamence za broenje.
- if(left == 0 || right == n+1){
- /// Nadvor od granicite. Ako smeeme da broime, imame nov palindrom, i dodadi go.
- ways[left][right][shouldAdd] = shouldAdd;
- } else {
- /// Pomesti desna granica, i iskluci broenje ako se stigne do kraj
- int val = ways[left][right+1][0];
- if(shouldAdd){
- /// Ako smeeme da broime, pomesti se levo i dodadi gi palindromite
- val = (val + ways[left-1][right][1]) % mod;
- }
- if(s[left-1] == s[right-1]){
- /// Mozeme da sozdademe nov palindrom. Dodadi gi site palindromi sto mozeme posle segasniot da gi sozdademe.
- val = (val + ways[left-1][right+1][1]) % mod;
- }
- /// Postavi ja vrednosta vo ways
- ways[left][right][shouldAdd] = val;
- }
- }
- }
- }
- /// Krajniot rezultat
- int res = 0;
- for(int i = 1;i<=n;++i){
- /// Za sekoj centar na palindrom i, presmetaj kolku vkupno takvi palindromi postojat.
- res = (res + ways[i-1][i+1][1]) % mod;
- }
- /// Pecati go rezultatot
- cout<<res<<endl;
- }
- int main(){
- ios::sync_with_stdio(false);
- /// Povikaj ja resavackata funkcija.
- run();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement