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算法. 米勒拉宾算法是一 ...
随机推荐
- js 邮箱,手机电话验证
var mail=/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/; var tel=/^(\d3,4|\d{3,4} ...
- Robot Framework:日志输出中文Unicode编码
robotframework 输出日志时,中文显示为Unicode编码 . 修改方法: 在Python27\Lib\site-packages\robotframework-3.0.4-py2.7.e ...
- 后端获取前端的多个数据用getlist
authors = request.POST.getlist("authors") print(authors) 得到一串作者的名字
- AcWing 156. 矩阵 (哈希二维转一维查询)打卡
给定一个M行N列的01矩阵(只包含数字0或1的矩阵),再执行Q次询问,每次询问给出一个A行B列的01矩阵,求该矩阵是否在原矩阵中出现过. 输入格式 第一行四个整数M,N,A,B. 接下来一个M行N列的 ...
- 最全的PS快捷键大全!
一.工具箱 01.(多种工具共用一个快捷键的可同时按[Shift]加此快捷键选取)02.矩形.椭圆选框工具 [M]03.裁剪工具[C]04.移动工具[V]05.套索.多边形套索.磁性套索[L]06.魔 ...
- es批量索引
使用Python操作Elasticsearch数据索引的教程 这篇文章主要介绍了使用Python操作Elasticsearch数据索引的教程,Elasticsearch处理数据索引非常高效,要的朋友可 ...
- 使用python发送163邮件 qq邮箱
使用python发送163邮件 def send_email(title, content): import smtplib from email.mime.multipart import MIME ...
- python安装 cvxpy 巨坑,一堆C++错误
https://www.lfd.uci.edu/~gohlke/pythonlibs/#ecos 下载scs,ecos,cvxpy的whl,一个个安装即可 之前被一堆C++错误搞晕了2小时
- PHP面试 PHP基础知识 八(会话控制)
---恢复内容开始--- PHP会话控制技术 首先了解一下为什么要使用会话控制技术? 本身web 与服务器的交互是通过HTTP协议来实现的,而HTTP协议又是无状态协议.就是说明HTTP协议没有一个內 ...
- 『Golang』—— 标准库之 time
... package main import ( "fmt" "time" ) func main() { time.AfterFunc(time.Milli ...