1. 程式人生 > >391B Word Folding(題目超難題解超簡單的DP)

391B Word Folding(題目超難題解超簡單的DP)

You will receive 5 points for solving this problem.

Manao has invented a new operation on strings that is called folding. Each fold happens between a pair of consecutive letters and places the second part of the string above first part, running in the opposite direction and aligned to the position of the fold. Using this operation, Manao converts the string into a structure that has one more level than there were fold operations performed. See the following examples for clarity.

We will denote the positions of folds with '|' characters. For example, the word "ABRACADABRA" written as "AB|RACA|DAB|RA" indicates that it has been folded three times: first, between the leftmost pair of 'B' and 'R' letters; second, between 'A' and 'D'; and third, between the rightmost pair of 'B

' and 'R' letters. Here are several examples of folded strings:

"ABCDEF|GHIJK" |  "A|BCDEFGHIJK" |  "AB|RACA|DAB|RA" |  "X|XXXXX|X|X|XXXXXX"
               |                 |                   |       XXXXXX
    KJIHG      |   KJIHGFEDCB    |      AR           |       X
   ABCDEF      |            A    |     DAB           |       X
               |                 |     ACAR          |       XXXXX
               |                 |       AB          |           X

One last example for "ABCD|EFGH|IJ|K":

 K
IJ
HGFE
ABCD

Manao noticed that each folded string can be viewed as several piles of letters. For instance, in the previous example, there are four piles, which can be read as "AHI", "BGJK", "CF", and "DE" from bottom to top. Manao wonders what is the highest pile of identical letters he can build using fold operations on a given word. Note that the pile should not contain gaps and should start at the bottom level. For example, in the rightmost of the four examples above, none of the piles would be considered valid since each of them has gaps, starts above the bottom level, or both.

Input

The input will consist of one line containing a single string of n characters with 1 ≤ n ≤ 1000 and no spaces. All characters of the string will be uppercase letters.

This problem doesn't have subproblems. You will get 5 points for the correct submission.

Output

Print a single integer — the size of the largest pile composed of identical characters that can be seen in a valid result of folding operations on the given string.

Example Input
ABRACADABRA
Output
3
Input
ABBBCBDB
Output
3
Input
AB
Output
1
Note

Consider the first example. Manao can create a pile of three 'A's using the folding "AB|RACAD|ABRA", which results in the following structure:

ABRA
DACAR
   AB

In the second example, Manao can create a pile of three 'B's using the following folding: "AB|BB|CBDB".

CBDB
BB
AB

Another way for Manao to create a pile of three 'B's with "ABBBCBDB" is the following folding: "AB|B|BCBDB".

 BCBDB
 B
AB

In the third example, there are no folds performed and the string is just written in one line.


 【題解】  這題乍一看一臉懵比,又是摺疊又是字串一通亂搞,完全不知道它在說什麼,靜下心來想一想,把題目意思再細細品味一下,會發現,它要在給定的字串裡找到幾個可以插入隔板的位置,這些隔板把隔板左右分割開,設隔板的位置為 i ,分割後的字串兩端要對稱,是最左邊和最右邊對稱,不是兩邊所有字元完全對稱,比如樣例1,ABRACADABRA ,在第一個B和R中間插入板子,可以使兩個A對稱,那麼就可以滿足,然後再在最後面的AB和RA之間插入板子,可以讓其對稱,(你或許會想在第四個A後面插個板子也可以把最後6個字元對稱,但是請注意,最後四個字元已經用過了,最後一個A要和倒數第二個A對稱,所以就不可能和倒數第三個A做對稱了),相信現在你應該明白這題的意思了吧,出題人真是用心良苦啊,哈哈,所以思路就是從前往後每次標記一個位置,然後從下一個位置開始,每次隔一個點,判斷它是不是和標記點字元一樣,一樣的話就可以構成對稱,遍歷一遍後,找到最大值即可,

ps:所有的點初始化都是1,即剛開始都只有當前點自身,我在程式碼中初始化為0,但在結果處加了1,具體看程式碼;

 【AC程式碼】

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int main()
{
    int dp[100000],ans;
    char s[1005];
    while(~scanf("%s",s))
    {
        ans=0;
        memset(dp,0,sizeof(dp));
        int len=strlen(s);
        for(int i=0;i<len-1;++i)
        for(int j=i+1;j<len;j+=2){
            if(s[i]==s[j])
                dp[j]=dp[i]+1;
            ans=max(ans,dp[j]);
        }
        printf("%d\n",ans+1);
    }
    return 0;
}