串字符串KMP hdu3613Best Reward

这段时间朋友几篇文章介绍了改串字符串的文章. 关联文章的地址

    题目链接:

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

    题目意思:

    a-z每一个字母有一个值,给个字符串,让你分成两部分,每一部分至少有一个字符。

    如果该串是回文字符串,则该值为全部字符的值之和,如果不是字符串,则为0.

    让你计算怎样分割使得两部分的总和值最大。

    解题思绪:

    利用回文字符串的next[i]也是回文字符串的特点,求出串中全部的回文串。

    然后倒过来,求出后缀的会问字符串。

    然后一次遍历就可以求出最大的值。

    代码:

    每日一道理
这浓浓的母爱使我深深地认识到:即使你是一只矫健的雄鹰,也永远飞不出母爱的长空;即使你是一条扬帆行驶的快船,也永远驶不出母爱的长河!在人生的路上不管我们已走过多远,还要走多远,我们都要经过母亲精心营造的那座桥!
#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#include<stack>
#include<list>
#include<queue>
#define eps 1e-6
#define INF (1<<30)
#define PI acos(-1.0)
using namespace std;

#define Maxn 510000

int value[27],sum[2][Maxn]; //分离表示早年至后的回文串的值和从后到前的回文串的值
int ss[2][Maxn],next[Maxn*2]; //早年以后求出各值
char save[Maxn];
char stemp[Maxn*2];

void getnext(char * a,int len)
{
   int j=0;

   next[1]=0;
   for(int i=2;i<=len;i++)
   {
      while(j>0&&a[j+1]-a[i])
         j=next[j];
      if(a[j+1]==a[i])
         j++;
      next[i]=j;
   }
   return ;
}

int main()
{
   int t;

   scanf("%d",&t);
   while(t--)
   {
      for(int i=1;i<=26;i++)
         scanf("%d",&value[i]);
      scanf("%s",save+1);
      int len=strlen(save+1);
      memset(ss,0,sizeof(ss));
      for(int i=1;i<=len;i++) //预处理出全部的前缀值的和
         ss[0][i]=ss[0][i-1]+value[save[i]-'a'+1];
      for(int i=len;i>=1;i--) //预处理出全部的后缀值的和
         ss[1][len-i+1]=ss[1][len-i]+value[save[i]-'a'+1];

      strcpy(stemp+1,save+1);
      stemp[len+1]='*';
      strcpy(stemp+len+2,save+1);
     // printf("%s\n",stemp+1);
      std::reverse(stemp+len+2,stemp+len+len+2); //翻转
      //printf("%s\n",stemp+1);
      getnext(stemp,len+len+1);
      memset(sum,0,sizeof(sum));
      int i=len+len+1;
      do //是回文串,注意只有一个元素也是回文串
      {
         i=next[i];
        // printf("i:%d next[i]:%d\n",i,next[i]);
         sum[0][i]=ss[0][i];

      }while(next[i]);

      //倒过来再求一遍
      //printf("sum[0][1]:%d\n",sum[0][1]);
      std::reverse(stemp+1,stemp+len+1);
      std::reverse(stemp+len+2,stemp+len+len+2);
      getnext(stemp,len+len+1);
      i=len+len+1;
      do
      {
         i=next[i];
         sum[1][i]=ss[1][i];
      }while(next[i]);
      int ans=-INF;
      for(int i=1;i<len;i++)
         ans=max(ans,sum[0][i]+sum[1][len-i]);
      printf("%d\n",ans);
   }
   return 0;
}

    

    

    

文章结束给大家分享下程序员的一些笑话语录: 自行车
一个程序员骑着一个很漂亮的自行车到了公司,另一个程序员看到了他,问 到,“你是从哪搞到的这么漂亮的车的?”
骑车的那个程序员说, “我刚从那边过来, 有一个漂亮的姑娘骑着这个车过来, 并停在我跟前,把衣服全脱了,然后对我说,‘你想要什么都可以’”。
另一个程序员马上说到, “你绝对做了一个正确的选择, 因为那姑娘的衣服你 并不一定穿得了”。

--------------------------------- 原创文章 By
串和字符串
---------------------------------

原文地址:https://www.cnblogs.com/xinyuyuanm/p/3100673.html