zoj 2744 Palindromes

Posted 琴影

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了zoj 2744 Palindromes相关的知识,希望对你有一定的参考价值。

Palindromes

Time Limit: 2 Seconds      Memory Limit: 65536 KB

A regular palindrome is a string of numbers or letters that is the same forward as backward. For example, the string "ABCDEDCBA" is a palindrome because it is the same when the string is read from left to right as when the string is read from right to left.

Now give you a string S, you should count how many palindromes in any consecutive substring of S.

Input

There are several test cases in the input. Each case contains a non-empty string which has no more than 5000 characters.

Proceed to the end of file.

Output

A single line with the number of palindrome substrings for each case.

Sample Input

aba
aa

Sample Output

4
3

题意:求一个串的所有回文字串的个数,这里要讨论串是奇数串还是偶数串,我的处理办法是将其变成奇数串,详细见代码。

 1 #include <iostream>
 2 #include <string>
 3 #include <cstdio>
 4 using namespace std;
 5 int main(){
 6     string s1, s2 = "#";
 7     int left, right, count;
 8     while(cin >> s1){
 9         s2 = "#";
10         int len1 = s1.length();
11         //将串变成奇数串,避免分情况讨论,以前学习求最长回文字串的一个算法,看到的处理办法,挺好的 
12         for(int i = 0; i < len1; i++){
13             s2 += s1[i];
14             s2 += #;
15         }
16         int len2 = s2.length();
17         count = len1;//每个字符本身都算一个回文串 
18         for(int i = 1; i < len2 - 1; i++){
19             left = i - 1;
20             right = i + 1;
21             //中心向外扩散,一遇到不是回文串,那么再向外扩散的串都不是回文串 
22             while(left >= 0 && right < len2 && s2[left] == s2[right]){
23                 if(s2[left] != #)
24                     count++;
25                 left--;
26                 right++;
27             }
28         }
29         printf("%d\n", count);
30     }
31     return 0;
32 }

 

以上是关于zoj 2744 Palindromes的主要内容,如果未能解决你的问题,请参考以下文章

zoj 2744 Palindromes(计算回文子串个数的优化策略)

2744 养鱼喂妹纸

BZOJ 2744: [HEOI2012]朋友圈

Bailian2744 子串

UVa 401 Palindromes(简单字符串)

11584 - Partitioning by Palindromes——[DP]