• HDU-3608 最长回文


    HDU-3608 最长回文

    题面

    Problem Description
    给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度.
    回文就是正反读都是一样的字符串,如aba, abba等

    Input
    输入有多组case,不超过120组,每组输入为一行小写英文字符a,b,c...y,z组成的字符串S
    两组case之间由空行隔开(该空行不用处理)
    字符串长度len <= 110000

    Output
    每一行一个整数x,对应一组case,表示该组case的字符串中所包含的最长回文长度.

    题意

    给一个字符串 求出他的最长回文。用KMP也行。学习一下Manacher吧=w=

    不关同步直接TLE,关同步就可以辣

    代码

    #include <bits/stdc++.h>
    using namespace std;
    
    string d;
    char a[220010];
    int p[220020];
    int cnt;
    int id,maxid;
    
    int manacher()
    {
    	memset(a,0,sizeof a);
    	memset(p,0,sizeof p);
    	cnt=id=maxid=0;
    	a[0]='$';
    	for (int i=0;i<d.size();i++) a[++cnt]='#',a[++cnt]=d[i];
    	a[++cnt]='#';
    	
    	for (int i=1;i<=cnt;i++)
    	{
    		if (maxid>i)
    		{
    			p[i]=min(p[2*id-i],maxid-i);
    		}
    		else 
    		{
    			p[i]=1;
    		}
    		while (a[i+p[i]]==a[i-p[i]]) p[i]++;
    		if (i+p[i]>maxid)
    		{
    			id=i;
    			maxid=i+p[i];
    		}
    	}
    	
    	int ans=0;
    	for (int i=1;i<=cnt;i++) ans=max(ans,p[i]-1);
    	return ans;
    }
    
    int main()
    {
    	ios::sync_with_stdio(false);
    	while (cin>>d)
    		cout<<manacher()<<endl;
    } 
    

    题目链接

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

  • 相关阅读:
    char *p = "abcdefg"; p[0] = p[1]出错
    最近在 OS-10.9下配置opencv, cgal, latex, qt, pillow
    Python文件操作
    Python字典和集合
    Python目录操作
    python处理中文(待补充)
    混合高斯模型
    随机生成某些稀疏矩阵
    matlab注释
    C#中int,string,char[],char的转换(待续)
  • 原文地址:https://www.cnblogs.com/EDGsheryl/p/7284019.html
Copyright © 2020-2023  润新知