HDU-3068 最长回文串
来源:互联网 发布:管家婆软件怎么样 编辑:程序博客网 时间:2024/05/16 08:53
用的Manacher法,O(n)复杂度,证明跟kmp算法一样说不清
代码基本上是参考博客链接
dp法内存不够,中心扩展法时间不够
//Manacher法#include <cstdio>#include <cstring>#include <vector>#include <queue>#include <iostream>#include <cmath>#include <vector>#include <algorithm>#include <map>#include <set>using namespace std;typedef long long ll;#define DEBUGconst int maxn=110000*2+5,maxv=26,INF=0x3f3f3f3f,mod=100000000;char str[maxn],s[maxn];int rad[maxn];int main(){#ifdef DEBUG freopen("in.txt", "r", stdin); freopen("out.txt", "w", stdout);#endif while(cin>>str){ int len=strlen(str); int ans=0; memset(rad,0,sizeof(rad)); for(int i=0;i<len;i++){ s[2*i]='#',s[2*i+1]=str[i]; } s[2*len]='#';s[2*len+1]='\0'; int n=strlen(s); for(int i=1,j=0,k;i<n;i+=k){ while(s[i-j-1]==s[i+j+1]&&i+j+1<n)j++; rad[i]=j; for(k=1;k<=j&&rad[i-k]+k!=rad[i];k++){ rad[i+k]=min(rad[i-k],rad[i]-k); } j=max(j-k,0); } for(int i=0;i<n;i++){ // printf("%d ", rad[i]); ans=max(ans,rad[i]); } printf("%d\n",ans); }#ifdef DEBUG fclose(stdin); fclose(stdout);#endif return 0;}
//中心扩展法#include <cstdio>#include <cstring>#include <vector>#include <queue>#include <iostream>#include <cmath>#include <vector>#include <algorithm>#include <map>#include <set>using namespace std;typedef long long ll;#define DEBUGconst int maxn=110000+5,maxv=26,INF=0x3f3f3f3f,mod=100000000;char str[maxn];int main(){#ifdef DEBUG freopen("in.txt", "r", stdin); freopen("out.txt", "w", stdout);#endif while(cin>>str){ int n=strlen(str); int ans=1; for(int i=0;i<n;i++){ int j=i,k=i; while(j>=0&&k<n){ j--;k++; if(str[j]==str[k]){ ans=max(ans,k-j+1); } } } for(int i=0;i<n-1;i++){ int j=i,k=i+1; while(j>=0&&k<n){ if(str[j]==str[k]){ ans=max(ans,k-j+1); } j--;k++; } } printf("%d\n",ans); }#ifdef DEBUG fclose(stdin); fclose(stdout);#endif return 0;}
//dp法,内存开不了那么大#include <cstdio>#include <cstring>#include <vector>#include <queue>#include <iostream>#include <cmath>#include <vector>#include <algorithm>#include <map>#include <set>using namespace std;typedef long long ll;#define DEBUGconst int maxn=110000+5,maxv=26,INF=0x3f3f3f3f,mod=100000000;int dp[maxn][maxn];char str[maxn];int main(){#ifdef DEBUG freopen("in.txt", "r", stdin); freopen("out.txt", "w", stdout);#endif while(cin>>str){ int n=strlen(str); int ans=1; memset(dp,0,sizeof(dp)); for(int i=0;i<n;i++){ if(i&&str[i-1]==str[i])dp[i-1][i]=1,ans=2; dp[i][i]=1; } for(int i=3;i<=n;i++){ for(int j=0;j<n;j++){ if(j+i-1>=n)break; if(dp[j+1][j+i-2])dp[j][j+i-1]=1,ans=i; } } printf("%d\n",ans); }#ifdef DEBUG fclose(stdin); fclose(stdout);#endif return 0;}
阅读全文
0 0
- HDU 3068 最长回文 [Manacher回文串]
- HDU 3068最长回文串
- HDU 3068 最长回文串
- HDU 3068 最长回文串
- HDU 3068 最长回文串
- hdu 3068 最长回文串
- HDU-3068 最长回文串
- hdu 3068 最长回文 + 最长回文串算法
- hdu 3068 最长回文(manacher&最长回文子串)
- hdu 3068 最长回文(最长回文子串 manacher算法)
- HDU 3068 最长回文(求最长回文子串)
- HDU 3068 最长回文 最长回文子串
- HDU 3068 ( 最长回文 )
- HDU-3068 最长回文
- hdu 3068 最长回文
- Hdu 3068 最长回文
- HDU 3068 最长回文
- HDU-3068-最长回文
- 【iOS】RxSwift官方Example3--地理位置监听
- C#+VS2012图片二进制流与数据库MySql、水晶报表间的操作(二)
- 小屏幕控制 (类似lol小地图)
- 字符串练习17_字符串判等
- 3、IP网际协议
- HDU-3068 最长回文串
- 字符串练习18_验证子串
- css清除浮动float总结
- python --- 处理很长的判断语句,多重赋值,联合删除
- Oracle用户和权限
- 二步实现 远程连接 阿里云SqlServer 2012 数据库服务器
- C语言实现的ABCI
- CodeForces
- Struts2-数据验证