题目链接:点击查看

题目大意:给出一个字符串 s 和一个暴力程序,用于求解 s 的每个后缀和原字符串的最长公共前缀,现在问一共需要执行多少次比较操作

题目分析:首先肯定不能暴力去模拟,时间复杂度n*n,也不能用后缀数组,这个题好像特地卡了后缀数组的时间,倍增法nlogn会被卡掉,DC3因为常数太大也会被卡掉,网上说AC自动机会被卡内存,因为整个字符集是ASCII码的范围,那就只能用扩展KMP来求解了,扩展KMP在O(n)时间内求解出extend[ i ]数组,表示字符串 s 的每个后缀和字符串 t 匹配的最长公共前缀,这样一来就和这个题目对应上了,将字符串 t 的位置替换上字符串 s 就是答案了,记得特判一下每次匹配是否匹配到末尾,如果不是末尾需要加一,因为最后那次匹配失败也算一次匹配操作

代码:

#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<sstream>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=1e6+100;char s[N];LL Next[N],extend[N];//预处理计算Next数组
void getNext(char str[])
{int i=0,j,po,len=strlen(str);Next[0]=len; //初始化Next[0]while(str[i]==str[i+1] && i+1<len) i++; Next[1]=i; //计算Next[1]po=1; //初始化po的位置for(i=2;i<len;i++){if(Next[i-po]+i < Next[po]+po) //第一种情况,可以直接得到Next[i]的值Next[i]=Next[i-po];else //第二种情况,要继续匹配才能得到Next[i]的值{j = Next[po]+po-i;if(j<0) j=0; //如果i>po+Next[po],则要从头开始匹配while(i+j<len && str[j]==str[j+i]) j++; Next[i]=j;po=i; //更新po的位置}}
}//计算extend数组
void EXKMP(char s1[],char s2[])
{int i=0,j,po,len=strlen(s1),l2=strlen(s2);getNext(s2); //计算子串的Next数组while(s1[i]==s2[i] && i<l2 && i<len) i++; extend[0]=i;po=0; //初始化po的位置for(i=1;i<len;i++){if(Next[i-po]+i < extend[po]+po) //第一种情况,直接可以得到extend[i]的值extend[i]=Next[i-po];else //第二种情况,要继续匹配才能得到extend[i]的值{j = extend[po]+po-i;if(j<0) j=0; //如果i>extend[po]+po则要从头开始匹配while(i+j<len && j<l2 && s1[j+i]==s2[j]) j++; extend[i]=j;po=i; //更新po的位置}}
}int main()
{
//  freopen("input.txt","r",stdin);
//  ios::sync_with_stdio(false);int w;cin>>w;while(w--){scanf("%s",s);int n=strlen(s);getNext(s);EXKMP(s,s);LL ans=0;for(int i=1;i<n;i++)ans+=extend[i]+(extend[i]!=n-i);printf("%lld\n",ans);}return 0;
}

HDU - 6629 string matching(扩展KMP)相关推荐

  1. HDU - 4333 Revolving Digits(扩展KMP)

    题目链接:点击查看 题目大意:给出一个由 n 个数位组成的数字,现在可以通过将其不同的后缀移到前面来组成 n 个新的数字,现在要求出 n 个新数字进行去重后,有多少个新数字分别大于.等于.小于原数字 ...

  2. Gym - 101981 Problem M. Mediocre String Problem (扩展KMP + Manacher)

    Problem M. Mediocre String Problem 题目链接:https://vjudge.net/problem/Gym-101981M 题目大意:给出两个串S,T,从S中选择 i ...

  3. 2018ICPC 南京 Mediocre String Problem 扩展KMP + Manacher

    题目大意为计算 S S S 串的子串 s s s 串和 T T T 中的前缀 t t t 串拼起来是回文串的种数的总贡献,要求 s s s 串长度大于 t t t, s + t s+t s+t 是回文 ...

  4. HDU 3613 Best Reward 扩展kmp算法(将一个字符串分成两个回文串)

    题目链接:https://vjudge.net/problem/HDU-3613 After an uphill battle, General Li won a great victory. Now ...

  5. 扩展KMP --- HDU 3613 Best Reward

    Best Reward Problem's Link:   http://acm.hdu.edu.cn/showproblem.php?pid=3613 Mean: 给你一个字符串,每个字符都有一个权 ...

  6. 南阳5--Binary String Matching(Kmp)

    Binary String Matching 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 Given two strings A and B, whose alpha ...

  7. HDU 3613 Best Reward 正反两次扩展KMP

    题目来源:HDU 3613 Best Reward 题意:每一个字母相应一个权值 将给你的字符串分成两部分 假设一部分是回文 这部分的值就是每一个字母的权值之和 求一种分法使得2部分的和最大 思路:考 ...

  8. HDU - 4300 Clairewd’s message(扩展KMP)

    题目链接:点击查看 题目大意:给出两个字符串 s 和 t ,字符串 s 代表着一种密码的映射,字符串 t 代表着一段密文+明文,题目保证密文是完整的,但明文只有一部分,现在问如何补全字符串 t ,使得 ...

  9. HDU - 6153 A Secret(KMP的next数组性质/扩展KMP)

    题目链接:点击查看 题目大意:给出两个字符串a和b,我们首先定义L:字符串b当前的后缀子字符串长度,N:字符串b当前的后缀在字符串a中出现的次数,现在询问,对于字符串b的每一个后缀,求出L*N之和,答 ...

最新文章

  1. android 网络加载图片点击大图后 浏览 可 缩放,Android 网络加载图片点击大图后 浏览 可 缩放...
  2. 《系统集成项目管理工程师》必背100个知识点-47质量保证人员(QA)的主要工作...
  3. K-均值对地图上的点进行聚类(2)
  4. Python程序开发——第一章 基本python语法
  5. Git 在团队中的最佳实践--如何正确使用Git Flow
  6. 快速排序的C++实现
  7. 普通话测试-短文60篇文章,附带拼音(1-10篇)
  8. 如何修改steam中dota服务器,STEAM玩刀塔自走棋如何设置_STEAM玩刀塔自走棋教程_玩游戏网...
  9. excel表格同一单元格里删除重复词
  10. java平台rpg游戏丧尸_RPG的生存游戏你玩过吗?《Dead Age》带你逃离丧尸
  11. WebApp网页真机调试工具-(Android)
  12. 计算机硬件常见配件的性能指标,计算机硬件的功能和功能
  13. 十大领域五大过程组(上):你必须了解的项目管理常识
  14. 2021-08-14 WPF控件专题 ContextMenu 控件详解
  15. 零基础学习数据分析路线,学习到什么程度可以找到工作
  16. 用计算机模拟股票大盘,股票模拟盘操作与实盘不同之处有哪些
  17. 磨人小问题-正正经经解决方法(2)——关于u盘(资料已备份)被写保护无法操作文件如何解决的问题——使用量产工具
  18. 配置高低档计算机,电脑配置高但是卡_电脑配置高但是fps低
  19. 郭明錤:Meta收缩有利于VR竞品发展,苹果XR头显将改变行业规则
  20. 合成大西瓜开发源码,手把手教你运行和部署大西瓜游戏项目

热门文章

  1. iis6扩展php_Web服务器IIS6的PHP5.2.5最佳配置方法
  2. Jasypt 加密-整合SpringBoot
  3. MySQL高级 - 锁 - InnoDB行锁 - 行锁升级为表锁
  4. MySQL高级 - 存储引擎 - 选择原则
  5. Spring-Cloud组件:eureka
  6. BeanPostProcessor 源码
  7. 关于FactoryBean 和BeanFactory
  8. Spring-Cloud中的 熔断、限流、降级
  9. 通过docker的方式进行RocketMQ的安装
  10. 分隔线演练-利用参数增加分隔线的灵活度