回文相关算法

Manacher

AC BZOJ 2565

  1 #include <cstdio>
  2 #include <fstream>
  3 #include <iostream>
  4  
  5 #include <cstdlib>
  6 #include <cstring>
  7 #include <algorithm>
  8 #include <cmath>
  9  
 10 #include <queue>
 11 #include <vector>
 12 #include <map>
 13 #include <set>
 14 #include <stack>
 15 #include <list>
 16  
 17 typedef unsigned int uint;
 18 typedef long long int ll;
 19 typedef unsigned long long int ull;
 20 typedef double db;
 21  
 22 using namespace std;
 23  
 24 inline int getint()
 25 {
 26     int res=0;
 27     char c=getchar();
 28     bool mi=false;
 29     while(c<'0' || c>'9') mi=(c=='-'),c=getchar();
 30     while('0'<=c && c<='9') res=res*10+c-'0',c=getchar();
 31     return mi ? -res : res;
 32 }
 33 inline ll getll()
 34 {
 35     ll res=0;
 36     char c=getchar();
 37     bool mi=false;
 38     while(c<'0' || c>'9') mi=(c=='-'),c=getchar();
 39     while('0'<=c && c<='9') res=res*10+c-'0',c=getchar();
 40     return mi ? -res : res;
 41 }
 42 
 43 //==============================================================================
 44 //==============================================================================
 45 //==============================================================================
 46 //==============================================================================
 47 
 48 int n,len;
 49 
 50 char s[205000];
 51 char t[405000];
 52 
 53 int l[405000];
 54 int v[205000];
 55 
 56 int a[205000];
 57 int b[205000];
 58 
 59 int main()
 60 {
 61     //read
 62     {
 63         char c;
 64         while(!islower(c=getchar()));
 65         s[n++]=c;
 66         while(islower(c=getchar())) s[n++]=c;
 67     }
 68     
 69     //Manacher
 70     {
 71         for(int i=0;i<n;i++)
 72         t[i*2]='#',t[i*2+1]=s[i];
 73     
 74         len=n*2+1;
 75         t[0]='[';
 76         t[len-1]=']';
 77         
 78         int mx=1,p=0;
 79         for(int i=0;i<len;i++)
 80         {
 81             l[i]=( mx>i ? min(l[2*p-i],mx-i) : 1 );
 82             
 83             while(t[i-l[i]]==t[i+l[i]]) l[i]++;
 84             
 85             if(l[i]+i>mx)
 86             {
 87                 p=i;
 88                 mx=l[i]+i;
 89             }
 90         }
 91     }
 92     
 93     //cal
 94     int p=0;
 95     for(int i=0;i<len;i++)
 96     {
 97         while(p+l[p]<=i) p++;
 98         a[i]=i-p+1;
 99     }
100     
101     p=len-1;
102     for(int i=len-1;i>=0;i--)
103     {
104         while(p-l[p]>=i) p--;
105         b[i]=p-i+1;
106     }
107     
108     int res=0;
109     for(int i=2;i<len-2;i+=2)
110     res=max(res,a[i-1]+b[i+1]);
111     
112     printf("%d\n",res);
113 
114     return 0;
115 }
View Code

代码很短很好背也比较容易理解....

注意一下细节,比如min还有加一减一之类还有大于和不小于之类就差不多了......

转载于:https://www.cnblogs.com/DragoonKiller/p/4536745.html

内容概要:本文档主要展示了C语言中关于字符串处理、指针操作以及动态内存分配的相关代码示例。首先介绍了如何实现键值对(“key=value”)字符串的解析,包括去除多余空格和根据键获取对应值的功能,并提供了相应的测试用例。接着演示了从给定字符串中分离出奇偶位置字符的方法,并将结果分别存储到两个不同的缓冲区中。此外,还探讨了常量(const)修饰符在变量和指针中的应用规则,解释了不同类型指针的区别及其使用场景。最后,详细讲解了如何动态分配二维字符数组,并实现了对这类数组的排序与释放操作。 适合人群:具有C语言基础的程序员或计算机科学相关专业的学生,尤其是那些希望深入理解字符串处理、指针操作以及动态内存管理机制的学习者。 使用场景及目标:①掌握如何高效地解析键值对字符串并去除其中的空白字符;②学会编写能够正确处理奇偶索引字符的函数;③理解const修饰符的作用范围及其对程序逻辑的影响;④熟悉动态分配二维字符数组的技术,并能对其进行有效的排序和清理。 阅读建议:由于本资源涉及较多底层概念和技术细节,建议读者先复习C语言基础知识,特别是指针和内存管理部分。在学习过程中,可以尝试动手编写类似的代码片段,以便更好地理解和掌握文中所介绍的各种技巧。同时,注意观察代码注释,它们对于理解复杂逻辑非常有帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值