HDU 3294 Girls' research Manaler算法

本文介绍了一种解决特殊条件下寻找字符串中最长回文子串问题的算法,通过Manaler算法处理并应用替换规则,最终输出回文串及其位置。

题面:

One day, sailormoon girls are so delighted that they intend to research about palindromic strings. Operation contains two steps:
First step: girls will write a long string (only contains lower case) on the paper. For example, "abcde", but 'a' inside is not the real 'a', that means if we define the 'b' is the real 'a', then we can infer that 'c' is the real 'b', 'd' is the real 'c' ……, 'a' is the real 'z'. According to this, string "abcde" changes to "bcdef".
Second step: girls will find out the longest palindromic string in the given string, the length of palindromic string must be equal or more than 2.
Input
Input contains multiple cases.
Each case contains two parts, a character and a string, they are separated by one space, the character representing the real 'a' is and the length of the string will not exceed 200000.All input must be lowercase.
If the length of string is len, it is marked from 0 to len-1.
Output
Please execute the operation following the two steps.
If you find one, output the start position and end position of palindromic string in a line, next line output the real palindromic string, or output "No solution!".
If there are several answers available, please choose the string which first appears.
Sample Input
b babd
a abcd
Sample Output
0 2
aza
No solution!

题目大意:

现在有一个字符串,里面有一些回文串。现在让你找出其中最长的那一个,并输出。
但还有另外一个条件,每个字符串之前会有一个字符,代表着一套替换规则。
如果是b,那么就是 \(b->a,c->b,d->c...a->z\)
最后就是把替换后的字符串输出,并把这个字符串的左右界输出(字符编号从0开始)

大致思路:

如果没有替换规则就是一个manaler的裸模板。然后对于求出来的最长回文串与相对的位置进行一些操作。
这个操作分为当 \(pos\)是奇数还是偶数。
vo具体操作看代码把

//pos是定位的最长回文串的位置,len是对应的长度
if(pos%2){
    l=pos-(len-1);
    l/=2;
    --l;
    r=pos+(len-1);
    r/=2;
    --r;
}else{
    mid=pos/2;
    l=mid-len/2-1;
    r=mid+len/2-1;
}

代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+7;
char str[maxn],tran[maxn<<2],basc;
int p[maxn<<2];
void print(int len)
{
    for(int i=1;i<len;++i)
        cout<<p[i]<<" ";
    cout<<endl;
}
void Manaler()
{
    memset(tran,0,sizeof(tran));
    memset(p,0,sizeof(p));
    int len_1=strlen(str),len_2=1;
    tran[0]='$';
    for(int i=0;i<len_1;++i){
        tran[len_2++]='#';
        tran[len_2++]=str[i];
    }
    tran[len_2++]='#';
    tran[len_2]='\0';
    int mi=0,r=0;
    for(int i=1;i<len_2;++i){       
        if(i<=r)
            p[i] = min(r-i,p[2*mi-i]);
        else
            p[i]=1;
        while(tran[i-p[i]]==tran[i+p[i]])
            ++p[i];
        if(i+p[i]>r){
            r = i+p[i];
            mi=i;
        }
    }
    //print(len_2);
    int k=basc-'a',pos=0,len=0;
        for(int i=1;i<len_2;++i){
            if(p[i]-1>len){
                len=p[i]-1;
                pos=i;
            }
        }
        if(len<2)
            cout<<"No solution!"<<endl;
        else{
            int mid,l,r;
            if(pos%2){
                l=pos-(len-1);
                l/=2;
                --l;
                r=pos+(len-1);
                r/=2;
                --r;
            }else{
                mid=pos/2;
                l=mid-len/2-1;
                r=mid+len/2-1;
            }
            cout<<l<<" "<<r<<endl;
            for(int i=pos-len;i<=pos+len;++i){
                if(tran[i]!='#') {
                    char c=(tran[i]-k);
                    if(c<'a')
                        c+=26;
                    cout<<c;
                }
            }
            cout<<endl;
        }
}
int main()
{
    ios::sync_with_stdio(false);
    while(cin>>basc>>str)
    {
        Manaler();
    }
    return 0;
}

转载于:https://www.cnblogs.com/SCaryon/p/9052739.html

学生社团系统-学生社团“一站式”运营管理平台-学生社团管理系统-基于SSM的学生社团管理系统-springboot学生社团管理系统.zip-Java学生社团管理系统开发实战-源码 更多学生社团系统: SpringBoot+Vue学生社团“一站式”运营管理平台源码(活动管理+成员考核+经费审批) Java学生社团管理系统开发实战:SSM升级SpringBoot(招新报名+场地预约+数据看板) 基于SpringSecurity的社团管理APP(移动端签到+权限分级+消息推送) 企业级社团数字化平台解决方案(SpringBoot+Redis缓存+Elasticsearch活动搜索) 微信小程序社团服务系统开发(活动直播+社团文化墙+成员互动社区) SpringBoot社团核心源码(多角色支持+工作流引擎+API接口开放) AI赋能社团管理:智能匹配兴趣标签+活动热度预测+成员贡献度分析(附代码) 响应式社团管理平台开发(PC/移动端适配+暗黑模式+无障碍访问) 完整学生社团系统源码下载(SpringBoot3+Vue3+MySQL8+Docker部署) 高校垂直领域社团平台:百团大战系统+社团星级评定+跨校活动联盟 适用对象:本代码学习资料适用于计算机、电子信息工程、数学等专业正在做毕设的学生,需要项目实战练习的学习者,也适用于课程设计、期末大作业。 技术栈:前端是vue,后端是springboot,项目代码都经过严格调试,代码没有任何bug! 核心管理:社团注册、成员管理、权限分级 活动运营:活动发布、报名签到、场地预约 资源服务:经费申请、物资管理、文档共享 数据分析:成员活跃度、活动效果评估、社团影响力排名
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值