hdu多校第五场1006 (hdu6629) string matching Ex-KMP
题意:
给你一个暴力匹配字符串公共前缀后缀的程序,为你对于某个字符串,暴力匹配的次数是多少。
题解:
使用扩展kmp构造extend数组,在扩展kmp中,设原串S和模式串T。
extend[i]表示T与S[i,n-1]的最长公共前缀。
在本题中,只需要将S,T均设为题目中输入的字符串即可,这样,extend[i]就表示从此位开始,最多能和前缀匹配上多少位。
由于失配也要比较一下,因此除非extend直接到了字符串末尾,否则要再加一。
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef long long ll;
const int M = 1e6 + ;
const LL mod = ;
const LL lINF = 0x3f3f3f3f3f3f3f3f;
const int MAX = ; //字符串长度最大值
ll extend[M];
ll Next[M];
void getNext(string t)
{
memset(Next,,sizeof Next);
ll len = t.length();
Next[] = len;
ll a, p;
a = ;
while (a < len && t[a] == t[a - ]) a++; // 求出长度为1的时候 解为多少
Next[] = a - ;
a = ;
for (ll i = ; i < len; i++) // 后续的按照算法来就好
{
p = a + Next[a] - ;
if ((i - ) + Next[i - a] < p) Next[i] = Next[i - a];// 第一种情况 没有超过等于的部分
else // 超过的话就不好直接用next的定义 需要后续的遍历
{
ll j = (p - i + ) > ? (p - i + ) : ;
while (i + j < len && t[i + j] == t[j]) j++;
Next[i] = j;
a = i;
}
}
}
void exkmp(string s, string t) // s->extend t->next
{
getNext(t);
ll a, p;//
ll slen = s.length();
ll tlen = t.length();
a = p = ;
ll len = min(s.length(), t.length());
while (p < len && t[p] == s[p]) p++; // after
extend[] = p;
for (ll i = ; i < slen; i++)
{
p = a + extend[a] - ; // update
if ((i - ) + Next[i - a] < p) extend[i] = Next[i - a];
else
{
ll j = (p - i + ) > ? (p - i + ) : ;
while (j < tlen && i + j < slen && s[i + j] == t[j]) j++;
extend[i] = j;
a = i;
}
}
}
int t;
char s1[M];
LL ans;
int len;
int main()
{
scanf("%d", &t);
while (t--)
{
scanf("%s", s1);
exkmp(s1, s1);
len = strlen(s1);
ans = ;
for (int i = ; i <= len - ; i++)
{
if (extend[i] + i == len)
{
ans += (LL)extend[i];
}
else
{
ans += (LL)extend[i] + ;
}
}
printf("%lld\n",ans);
}
}
hdu多校第五场1006 (hdu6629) string matching Ex-KMP的更多相关文章
- [2019杭电多校第五场][hdu6629]string matching(扩展kmp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6629 题意求字符串的每个后缀与原串的最长公共前缀之和. 比赛时搞东搞西的,还搞了个后缀数组...队友一 ...
- hdu多校第五场1005 (hdu6628) permutation 1 排列/康托展开/暴力
题意: 定义一个排列的差分为后一项减前一项之差构成的数列,求对于n个数的排列,差分的字典序第k小的那个,n<=20,k<=1e4. 题解: 暴力打表找一遍规律,会发现,对于n个数的排列,如 ...
- 2014 HDU多校弟五场J题 【矩阵乘积】
题意很简单,就是两个大矩阵相乘,然后求乘积. 用 Strassen算法 的话,当N的规模达到100左右就会StackOverFlow了 况且输入的数据范围可达到800,如果变量还不用全局变量的话连内存 ...
- 2014 HDU多校弟五场A题 【归并排序求逆序对】
这题是2Y,第一次WA贡献给了没有long long 的答案QAQ 题意不难理解,解题方法不难. 先用归并排序求出原串中逆序对的个数然后拿来减去k即可,如果答案小于0,则取0 学习了归并排序求逆序对的 ...
- hdu多校第七场 1006(hdu6651) Final Exam 博弈
题意: 有n道题,这n道题共m分,要求你至少做出k道才能及格,你可以自由安排复习时间,但是只有某道题复习时间严格大于题目分配的分值时这道题才能够被做出来,求最少的,能够保证及格的复习时间.复习时间和分 ...
- hdu多校第五场1002 (hdu6625) three arrays 字典树/dfs
题意: 给你两个序列a,b,序列c的某位是由序列a,b的此位异或得来,让你重排序列ab,找出字典序最小的序列c. 题解: 如果能找到a,b序列中完全一样的值当然最好,要是找不到,那也尽量让低位不一样. ...
- hdu多校第五场1004 (hdu6627) equation 1 计算几何
题意: 给你一个C,再给你n组a,b,让你求x取什么值的时候,$ \sum_{i=1}^n |a_i*x+b_i| =C $,要求求出解的个数,并用最简分数从小到大表示,如果有无穷多解,输出-1. 题 ...
- hdu多校第五场1007 (hdu6630) permutation 2 dp
题意: 给你n个数,求如下限制条件下的排列数:1,第一位必须是x,2,最后一位必须是y,3,相邻两位之差小于等于2 题解: 如果x<y,那么考虑把整个数列翻转过来,减少讨论分支. 设dp[n]为 ...
- hdu多校第三场 1006 (hdu6608) Fansblog Miller-Rabin素性检测
题意: 给你一个1e9-1e14的质数P,让你找出这个质数的前一个质数Q,然后计算Q!mod P 题解: 1e14的数据范围pass掉一切素数筛法,考虑Miller-Rabin算法. 米勒拉宾算法是一 ...
随机推荐
- git——创建分支后,切换分支报错(error: pathspec 'master' did not match any file(s) known to git)
error: pathspec 'master' did not match any file(s) known to git 解决办法: 1.查看分支 git branch -a 2.获取所有分支 ...
- 【在线工具】java开发常用在线工具
转自:常用工具页面 Java源代码搜索 Grepcode是一个面向于Java开发人员的网站,在这里你可以通过Java的projects.classes等各种关键字在线查看它对应的源码,知道对应的pro ...
- Python 项目隔离环境virtualenv--venv
virtualenv 用来为一个应用创建一套“隔离”的python运行环境. 先安装virtualenv: pip3 install virtualenv 再进入项目目录,或者创建一个项目目录并进入, ...
- Android中的ListView的绘制过程中执行的方法
首先,系统在绘制ListView之前, 将会先调用getCount方法来获取Item的个数.(如果getCount方法返回0的话,列表时不显示任何内容的) 之后每绘制一个 Item就会调用一次getV ...
- linux 下vi与vim区别以及vim的使用
vi与vim vi编辑器是所有Unix及Linux系统下标准的编辑器,他就相当于windows系统中的记事本一样,它的强大不逊色于任何最新的文本编辑器.他是我们使用Linux系统不能缺少的工具.由于对 ...
- delphi 文件操作(信息获取)
delphi获取Exe文件版本信息的函数 Type TFileVersionInfo = Record FixedInfo:TVSFixedFileInfo; {版本信息} CompanyName:S ...
- HTTPS 加密原理探究
由于之前项目中IOS系统建议将http协议换成https协议所以查看相关资料在此记录 HTTPS 通讯过程的基本原理 问:Https是什么? 答: HTTP 协议定义了一套规范,让客户端或浏览器可以和 ...
- (5)centos7 文件权限
一. 目录信息 1.第一列 一共10位 (1)第1位表示 当为[ d ]则是目录 当为[ - ]则是文件 若是[ l ]则表示为连结档(link file): 若是[ b ]则表示为装置文件里面的可供 ...
- CSS Sprite初探之原理、使用
CSS Sprite简介: 利用CSS Sprites能很好地减少了网页的http请求次数,从而大大的提高了页面的性能,节省时间和带宽.CSS Sprites在国内很多人叫css精灵, 是一种网页图片 ...
- certbot免费证书
yum install python-certbot-nginx 开启防火墙443端口 firewall-cmd --add-port=443/tcp --permanent 别忘了重启 firewa ...