• HDOJ3613解题报告【拓展KMP】


    题目地址:

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

    题目概述:

      给出一个字符串s以及每个小写字母的价值,现要求将s分为两个部分,对于每部分,如果是回文串则这个子串的价值为所有字母的价值之和,否则为零,请合理分开这个串使总价值最大。

    大致思路:

      EX_KMP。其实也是没有看懂啦。

      不过看了下这位大神的BLOG:http://blog.csdn.net/dyx404514/article/details/41831947

      迷迷糊糊的过了……

    代码:

      1 #include <iostream>
      2 #include <cstdio>
      3 #include <cstdlib>
      4 #include <cmath>
      5 #include <vector>
      6 #include <ctime>
      7 #include <map>
      8 #include <stack>
      9 #include <queue>
     10 #include <cstring>
     11 #include <algorithm>
     12 using namespace std;
     13 
     14 #define sacnf scanf
     15 #define scnaf scanf
     16 #define maxn  500010
     17 #define maxm 26
     18 #define inf 1061109567
     19 #define Eps 0.00001
     20 const double PI=acos(-1.0);
     21 #define mod 7
     22 #define MAXNUM 10000
     23 void Swap(int &a,int &b) {int t=a;a=b;b=t;}
     24 int Abs(int x) {return (x<0)?-x:x;}
     25 typedef long long ll;
     26 typedef unsigned int uint;
     27 
     28 char s1[maxn],s2[maxn];
     29 int extend1[maxn],extend2[maxn],Next[maxn];
     30 int val[maxm],sum[maxn];
     31 
     32 void Get_Next(char *S,int len)
     33 {
     34     int po=0;
     35     Next[0]=len;
     36     while(po+1<len&&S[po]==S[po+1]) po++;
     37     Next[1]=po;po=1;
     38     for(int i=2;i<len;i++)
     39     {
     40         if(Next[i-po]+i<Next[po]+po) Next[i]=Next[i-po];
     41         else
     42         {
     43             int j=max(0,Next[po]+po-i);
     44             while(i+j<len&&S[j]==S[i+j]) j++;
     45             Next[i]=j;po=i;
     46         }
     47     }
     48 }
     49 
     50 void EKMP(char *S,char *T,int *extend,int len)
     51 {
     52     Get_Next(s1,len);
     53     int po=0;
     54     while(po<len&&S[po]==T[po]) po++;
     55     extend[0]=po;po=0;
     56     for(int i=1;i<len;i++)
     57     {
     58         if(Next[i-po]+i<extend[po]+po) extend[i]=Next[i-po];
     59         else
     60         {
     61             int j=max(0,extend[po]+po-i);
     62             while(i+j<len&&S[i+j]==T[j]) j++;
     63             extend[i]=j;po=i;
     64         }
     65     }
     66 }
     67 
     68 int main()
     69 {
     70     //freopen("data.in","r",stdin);
     71     //freopen("data.out","w",stdout);
     72     //clock_t st=clock();
     73     int T;scanf("%d",&T);
     74     while(T--)
     75     {
     76         for(int i=0;i<26;i++) scanf("%d",&val[i]);
     77         scanf("%s",s1);int len=strlen(s1);sum[0]=0;
     78         for(int i=0;i<len;i++)
     79         {
     80             sum[i+1]=sum[i]+val[s1[i]-'a'];
     81             s2[len-i-1]=s1[i];
     82         }
     83 
     84         EKMP(s2,s1,extend1,len);
     85         EKMP(s1,s2,extend2,len);
     86 
     87         int ans=0;
     88         for(int i=1;i<len;i++)
     89         {
     90             int temp=0;
     91             if(extend1[len-i]==i) temp+=sum[i];
     92             if(extend2[i]==len-i) temp+=sum[len]-sum[i];
     93             ans=max(ans,temp);
     94         }
     95         printf("%d
    ",ans);
     96     }
     97     //clock_t ed=clock();
     98     //printf("
    
    Time Used : %.5lf Ms.
    ",(double)(ed-st)/CLOCKS_PER_SEC);
     99     return 0;
    100 }
  • 相关阅读:
    hdu 5100 n*n棋盘放k*1长方条最多覆盖面积
    poj 3635/hdu 1676 Full Tank? 车辆加油+最短路
    poj 3613 经过k条边最短路 floyd+矩阵快速幂
    2014上海全国邀请赛 解题报告
    漫谈程序员系列:看看你离优秀有多远
    C2第七次作业解题报告
    C++ STL
    hdu 5098 双队列拓扑排序
    深度学习数据集 近百个开源数据集
    helper工具包——基于cifar10数据集的cnn分类模型的模块
  • 原文地址:https://www.cnblogs.com/CtrlKismet/p/6561627.html
Copyright © 2020-2023  润新知