亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

HDU 3613 Best Reward(拓展KMP求前綴回文串)

系統 2213 0

鏈接:

http://acm.hdu.edu.cn/showproblem.php?pid=3613


題目大意:

給個字符串S,要把S分成兩段T1,T2,每個字母都有一個對應的價值,如果T1,T2是回文串(從左往右或者從右往左讀,都一樣),那么他們就會有一個價值,這個價值是這個串的所有字母價值之和,如果不是回文串,那么這串價值就為0。問最多能獲得多少價值?


分析與總結:

觀察字符串S,以及由S逆序得到的字符串T:

S:acacac

T:cacaca

如果要求S的前綴回文,只需要用拓展KMP算法讓S去匹配T,求出所有T的后綴T【i】與S前綴的公共串長度,保存在extend數組中,得到:0, 5, 0, 3, 0, 1

HDU 3613 Best Reward(拓展KMP求前綴回文串)

其中extend中的位置1,3,5是有公共串的,并且匹配的長度滿足extend[i] + i == len, len=|S|.

并且S這幾個長度的前綴都是回文串!


所以,對于我們只需要枚舉掃描一遍extend數組,掃描到的當前位置之前為前半部分T1, 然后用根據extend數組可以判斷T1是否是回文。那后半部分T2呢? 剛才是用S去匹配T, 如果要求后綴,只需要用T去匹配S,再得到一個數組extend2即可,根據這個extend2判斷后半部分T2是否是回文。



代碼:

    #include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

const int MAXN = 500005;
char S[MAXN];
char T[MAXN];
int  f[MAXN];
int  extend1[MAXN];
int  extend2[MAXN];
int  val[30];
int  sum[MAXN];

void revcpy(char* s,char* t,int len){
    memset(t, 0, sizeof(t));
    for(int i=0, k=len-1; i<len; ++i,--k)
        t[i] = s[k];
}
void getNext(char* T,int* next){
    int len=strlen(T), a=0;
    next[0]=len;
    while(a<len-1 && T[a]==T[a+1]) ++a;
    next[1]=a;
    a=1;
    for(int k=2; k<len; ++k){
        int p=a+next[a]-1, L=next[k-a];
        if(k+L-1>=p){
            int j=max(p-k+1,0);
            while(k+j<len && T[k+j]==T[j])++j;
            next[k]=j;
            a=k;
        }
        else
            next[k]=L;
   }
}

void EKMP(char* S,char* T,int* next, int* extend){  
    getNext(T,next);  
    int slen=strlen(S), tlen=strlen(T), a=0;  
    int minlen=min(slen,tlen);  
    while(a<minlen && S[a]==T[a])++a;  
    extend[0] = a;  
    a=0;  
    for(int k=1; k<slen; ++k){  
        int p=a+extend[a]-1, L=next[k-a];  
        if(k-1+L >= p){  
            int j=max(p-k+1,0);  
            while(k+j<slen && j<tlen && S[k+j]==T[j]) ++j;  
            extend[k] = j;  
            a=k;  
        }  
        else  
            extend[k] = L;  
    }  
}   

int main(){
    int nCase;
    scanf("%d",&nCase);
    while(nCase--){
        for(int i=0; i<26; ++i)
            scanf("%d",&val[i]);
        scanf("%s",S);
        memset(sum, 0, sizeof(sum));
        for(int i=0; S[i]; ++i){
            sum[i+1] = val[S[i]-'a']+sum[i];
        }
        int len=strlen(S);
        revcpy(S,T,strlen(S));
        EKMP(S,T,f,extend2);
        EKMP(T,S,f,extend1);

        int maxx=-1000000000;

        for(int i=0; i<len; ++i){
            if(i && extend1[i]+i==len){ //如果半部分是回文
                int pos=extend1[i];
                int tmp=sum[pos];
                if(extend2[pos]+pos==len){  // 看后半部分是否也是回文
                    tmp += sum[len]-sum[pos];
                }
                if(tmp > maxx)
                    maxx=tmp;
            }
            else{ //如果前半部分不是回文,看后半不部分
                int pos=i+1,tmp=0;
                if(extend2[pos]+pos==len){
                    tmp += sum[len]-sum[pos];
                }
                if(tmp > maxx)
                    maxx=tmp;
            }
        }
        printf("%d\n",maxx);
    }
    return 0;
}
  


—— 生命的意義,在于賦予它意義士。

原創 http://blog.csdn.net/shuangde800 By D_Double (轉載請標明)



HDU 3613 Best Reward(拓展KMP求前綴回文串)


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: chinese国产在线视频 | 天天操天天摸天天碰 | 久久综合亚洲 | 在线播放亚洲精品富二代91 | 久久美剧免费在线观看 | 羞羞视频在线看 | 男人天堂999 | 欧美啪 | 在线亚洲欧美性天天影院 | 一级做a爱片久久蜜桃 | 天天综合在线观看 | 老头老太做爰xxxx视频 | 欧美激情伦妇在线观看 | 白云精品视频国产专区 | 国产精品一区二区在线观看 | 国产精品亚欧美一区二区三区 | 日韩高清欧美 | 高清不卡一区 | 久久久久久亚洲精品中文字幕 | 欧美一区二区在线观看免费网站 | 免费一看一级毛片人 | 99色视频在线 | 久久97久久97精品免视看 | 欧美视频一区在线 | 欧美亚洲另类久久综合 | 婷婷综合色伊人阁 | 一级二级三级毛片 | 亚洲欧洲一区二区三区久久 | 日日操夜夜操天天操 | 欧美福利精品福利视频在线观看 | 成人深夜视频 | 亚洲国产天堂久久综合9999 | 成人欧美视频在线看免费 | 亚洲无吗在线视频 | 中文字幕欧美在线观看 | 国产不卡视频在线 | 欧美高清一区二区三区欧美 | 亚洲国产高清人在线 | 日韩一级a毛片欧美一级 | 爱爱一区 | 亚洲人和日本人jzz护士 |