暴力枚举大水题,判断回文,扩展KMP

#include <cstdio>
#include <cstring>
#include <algorithm> using namespace std; const int maxn = ; int a[];
char str[];
char str1[];
int s[]; int _next[maxn],_extend[maxn];
int next1[maxn],extend1[maxn]; void getnext(char *T) {
int a = ;
int Tlen = strlen(T);
_next[] = Tlen;
while(a<Tlen-&&T[a]==T[a+]) a++;
_next[] = a; a = ;
for(int k=; k < Tlen; k++) {
int p = a + _next[a] - ,L = _next[k-a];
if((k-)+L>=p) {
int j = (p-k+) > ? p - k + : ;
while(k+j<Tlen&&T[k+j]==T[j])
j++;
_next[k] = j;
a = k;
}
else _next[k] = L;
}
} void getextend(char *S,char *T) {
int a = ;
getnext(T); int Slen = strlen(S);
int Tlen = strlen(T); int Minlen = Slen < Tlen ? Slen : Tlen;
while(a<Minlen&&S[a]==T[a]) a++;
_extend[] = a;
a = ; for(int k = ; k < Slen; k++) {
int p = a + _extend[a] - ,L = _next[k-a];
if((k-)+L>=p) {
int j = (p-k+) > ? p - k + : ;
while(k+j<Slen&&j<Tlen&&S[k+j]==T[j]) j++;
_extend[k] = j;
a = k;
}
else
_extend[k] = L;
} } void getnext1(char *T) {
int a = ;
int Tlen = strlen(T);
next1[] = Tlen;
while(a<Tlen-&&T[a]==T[a+]) a++;
next1[] = a; a = ;
for(int k=; k < Tlen; k++) {
int p = a + next1[a] - ,L = next1[k-a];
if((k-)+L>=p) {
int j = (p-k+) > ? p - k + : ;
while(k+j<Tlen&&T[k+j]==T[j])
j++;
next1[k] = j;
a = k;
}
else next1[k] = L;
}
} void getextend1(char *S,char *T) {
int a = ;
getnext1(T); int Slen = strlen(S);
int Tlen = strlen(T); int Minlen = Slen < Tlen ? Slen : Tlen;
while(a<Minlen&&S[a]==T[a]) a++;
extend1[] = a;
a = ; for(int k = ; k < Slen; k++) {
int p = a + extend1[a] - ,L = next1[k-a];
if((k-)+L>=p) {
int j = (p-k+) > ? p - k + : ;
while(k+j<Slen&&j<Tlen&&S[k+j]==T[j]) j++;
extend1[k] = j;
a = k;
}
else
extend1[k] = L;
} } int main() {
int T;
scanf("%d",&T);
while(T--) { for(int i = ; i < ; i++)
scanf("%d",&a[i]); scanf("%s",str); int len = strlen(str); s[] = a[ str[] - 'a' ];
for(int i = ; i < len; i++)
s[i] = s[i-] + a[ str[i]-'a' ]; for(int i = ; i < len; i++)
str1[i] = str[len-i-]; getextend(str1,str);
getextend1(str,str1); int ans = ;
for(int i = ; i < len-; i++)
{
if(_extend[len-i-]==i+&&extend1[i+]==len-i-)
ans = max(ans,s[len-]);
else if(_extend[len-i-]==i+)
ans = max(ans,s[i]);
else if(extend1[i+]==len-i-)
ans = max(ans,s[len-]-s[i]);
} printf("%d\n",ans);
}
return ;
}

最新文章

  1. ios 颜色转图片
  2. hiveserver2
  3. Extjs改变树节点的勾选状态
  4. STL--向量(vector)
  5. selenium如何跳转到iframe
  6. Scala中的match(模式匹配)
  7. 爱普生 RS330 打印机墨水连供装置墨盒吸墨复位方法
  8. Jquery瀑布流布局
  9. 我开发了一个产品--Markdown Notes
  10. Hibernate 老外的完整教程
  11. Ubunut 13.04下配置memcached、 python MySQLDB,python-memcache模块等
  12. Class.forName()的作用与使用总结(转载)
  13. Linux + Apache + MySql+ Php 配置虚拟主机
  14. 数据结构 Python实现
  15. ES6新特性-函数的简写(箭头函数)
  16. C# 动态输出Dos命令执行结果
  17. E: The package code needs to be reinstalled, but I can&#39;t find an archive for it.
  18. bat命令行实现全盘遍历搜索文件
  19. 20165323 实验二 Java面向对象程序设计
  20. Spring事务的传播:PROPAGATION_REQUIRED

热门文章

  1. Java线程池详解(二)
  2. ubuntu下安装vue-cli框架
  3. (转) Linux Shell经典实例解析
  4. Nginx设置日志分割方法
  5. 8086实时时钟实验(一)——《x86汇编语言:从实模式到保护模式》05
  6. TCP-Java--图谱
  7. [ElasticSearch] 如何使用中文分詞ik與繁簡轉換stconvert插件
  8. C# ADO.NET
  9. SpringMVC:系统认识一下maven
  10. 了解WaitForSingleObject中WAIT_ABANDONED 返回值