String Problem HDU - 3374 (最大最小表示法+kmp求模式次数)

题目链接

题目大意:给你一个字符串,求它所有同构串(末尾元素移1个到开头算一次同构)中,字典序最大以及最小的串第一次出现的位置以及总共出现的次数。
位置由题目定义:如给出 SKYLONG
SKYLONG 1
KYLONGS 2
YLONGSK 3
LONGSKY 4
ONGSKYL 5
NGSKYLO 6
GSKYLON 7

很显然是一道最大最小表示法模板题。
思路就是先预处理字符串str,使得str=str+str;然后求出最大最小字符串起始点,分别用kmp算法求出其在str(预处理之后的)中的出现次数就好了(此时的str要去掉末尾字符,否则第一个字符串会出现两次 ,比如str=abcd,str=str+str,得str==abcdabcd,匹配时要变成abcdabc)。

#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<stdlib.h>
#include<string.h>
#include<string>
#include<vector>
#include<stack>
#include<queue>
#include<deque>
#include<unordered_map>
#include<math.h>
#include<set>
using namespace std;
#define INF 1000000
#define MAX 2000005
//最小表示法:设置2个指针p1=0,p2=1,代表可能的开头位置,向后探寻,如果相等就k++,否则如果p2更大,这个指针就
//暂时不得作为开头位置,更新到p1后面位置,也就是max(p2+k+1,p1+1)
int minpress(string s,int n)
{
    int p1=0,p2=1,k=0;//p1 p2都有可能是开头,先假设p1是开头
    while(p1<n && p2<n)
    {
        k=0;
        while(k<n && s[p1+k]==s[p2+k]) k++;//一路相等
        if(k==n) break;
        if(s[p1+k]>s[p2+k]) p1=max(p2+1,p1+k+1);//发现p1开头的会大于p2开头的,所以把p2变成开头,p1到p2后面去
        else if(s[p1+k]<s[p2+k]) p2=max(p1+1,p2+k+1);//p1保留作为开头,p2到达p2+k的下一位,看看p2+k+1会不会小于p1号元素
    }
    return min(p1,p2);//返回最小表示串首位置
}
int maxpress(string s,int n)
{
    int p1=0,p2=1,k=0;
    while(p1<n && p2<n)
    {
        k=0;
        while(k<n && s[p1+k]==s[p2+k]) k++;//一路相等
        if(k==n) break;
        if(s[p1+k]<s[p2+k]) p1=max(p2+1,p1+k+1);//p1开头目前行不通
        else if(s[p1+k]>s[p2+k]) p2=max(p1+1,p2+k+1);
    }
    return min(p1,p2);
}
int kmp(string pattern,string s)//返回出现次数
{
    int ans=0;
    int len1=s.size(),len2=pattern.size();
    s[len1-1]='\0';//最后一个字符加了的话,第一个会出现两次
    int match[len2+2];
    match[0]=-1;
    for(int i=1;i<len2;i++)
    {
        int j=match[i-1];
        while(j>=0 && pattern[j+1]!=pattern[i]) j=match[j];
        if(pattern[j+1]==pattern[i]) match[i]=j+1;
        else match[i]=-1;
    }
    int p1=0,p2=0;
    while(p1<len1)
    {
        if(pattern[p2]==s[p1]) p1++,p2++;
        else if(p2>0) p2=match[p2-1]+1;
        else p1++;
        if(p2==len2)
        {
            p2=match[p2-1]+1;//kmp求匹配次数的通用模板
            ans++;
        }
    }
    return ans;
}
int main() 
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    string s;
    while(cin>>s)
    {
        int len=s.size();
        s+=s;
        int minp=minpress(s,len)+1;
        int maxp=maxpress(s,len)+1;
        string s1=s.substr(minp-1,len),s2=s.substr(maxp-1,len);
        int times_minp=kmp(s1,s);
        int times_maxp=kmp(s2,s);
        printf("%d %d %d %d\n",minp,times_minp,maxp,times_maxp);
    }
    system("pause");
    return 0;
}

```时间290ms左右

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
东南亚位于我国倡导推进的“一带一路”海陆交汇地带,作为当今全球发展最为迅速的地区之一,近年来区域内生产总值实现了显著且稳定的增长。根据东盟主要经济体公布的最新数据,印度尼西亚2023年国内生产总值(GDP)增长5.05%;越南2023年经济增长5.05%;马来西亚2023年经济增速为3.7%;泰国2023年经济增长1.9%;新加坡2023年经济增长1.1%;柬埔寨2023年经济增速预计为5.6%。 东盟国家在“一带一路”沿线国家中的总体GDP经济规模、贸易总额与国外直接投资均为最大,因此有着举足轻重的地位和作用。当前,东盟与中国已互相成为双方最大的交易伙伴。中国-东盟贸易总额已从2013年的443亿元增长至 2023年合计超逾6.4万亿元,占中国外贸总值的15.4%。在过去20余年中,东盟国家不断在全球多变的格局里面临挑战并寻机遇。2023东盟国家主要经济体受到国内消费、国外投资、货币政策、旅游业复苏、和大宗商品出口价企稳等方面的提振,经济显现出稳步增长态势和强韧性的潜能。 本调研报告旨在深度挖掘东南亚市场的增长潜力与发展机会,分析东南亚市场竞争态势、销售模式、客户偏好、整体市场营商环境,为国内企业出海开展业务提供客观参考意见。 本文核心内容: 市场空间:全球行业市场空间、东南亚市场发展空间。 竞争态势:全球份额,东南亚市场企业份额。 销售模式:东南亚市场销售模式、本地代理商 客户情况:东南亚本地客户及偏好分析 营商环境:东南亚营商环境分析 本文纳入的企业包括国外及印尼本土企业,以及相关上下游企业等,部分名单 QYResearch是全球知名的大型咨询公司,行业涵盖各高科技行业产业链细分市场,横跨如半导体产业链(半导体设备及零部件、半导体材料、集成电路、制造、封测、分立器件、传感器、光电器件)、光伏产业链(设备、硅料/硅片、电池片、组件、辅料支架、逆变器、电站终端)、新能源汽车产业链(动力电池及材料、电驱电控、汽车半导体/电子、整车、充电桩)、通信产业链(通信系统设备、终端设备、电子元器件、射频前端、光模块、4G/5G/6G、宽带、IoT、数字经济、AI)、先进材料产业链(金属材料、高分子材料、陶瓷材料、纳米材料等)、机械制造产业链(数控机床、工程机械、电气机械、3C自动化、工业机器人、激光、工控、无人机)、食品药品、医疗器械、农业等。邮箱:market@qyresearch.com

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值