题意:

给你一个暴力匹配字符串公共前缀后缀的程序,为你对于某个字符串,暴力匹配的次数是多少。

题解:

使用扩展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的更多相关文章

  1. [2019杭电多校第五场][hdu6629]string matching(扩展kmp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6629 题意求字符串的每个后缀与原串的最长公共前缀之和. 比赛时搞东搞西的,还搞了个后缀数组...队友一 ...

  2. hdu多校第五场1005 (hdu6628) permutation 1 排列/康托展开/暴力

    题意: 定义一个排列的差分为后一项减前一项之差构成的数列,求对于n个数的排列,差分的字典序第k小的那个,n<=20,k<=1e4. 题解: 暴力打表找一遍规律,会发现,对于n个数的排列,如 ...

  3. 2014 HDU多校弟五场J题 【矩阵乘积】

    题意很简单,就是两个大矩阵相乘,然后求乘积. 用 Strassen算法 的话,当N的规模达到100左右就会StackOverFlow了 况且输入的数据范围可达到800,如果变量还不用全局变量的话连内存 ...

  4. 2014 HDU多校弟五场A题 【归并排序求逆序对】

    这题是2Y,第一次WA贡献给了没有long long 的答案QAQ 题意不难理解,解题方法不难. 先用归并排序求出原串中逆序对的个数然后拿来减去k即可,如果答案小于0,则取0 学习了归并排序求逆序对的 ...

  5. hdu多校第七场 1006(hdu6651) Final Exam 博弈

    题意: 有n道题,这n道题共m分,要求你至少做出k道才能及格,你可以自由安排复习时间,但是只有某道题复习时间严格大于题目分配的分值时这道题才能够被做出来,求最少的,能够保证及格的复习时间.复习时间和分 ...

  6. hdu多校第五场1002 (hdu6625) three arrays 字典树/dfs

    题意: 给你两个序列a,b,序列c的某位是由序列a,b的此位异或得来,让你重排序列ab,找出字典序最小的序列c. 题解: 如果能找到a,b序列中完全一样的值当然最好,要是找不到,那也尽量让低位不一样. ...

  7. hdu多校第五场1004 (hdu6627) equation 1 计算几何

    题意: 给你一个C,再给你n组a,b,让你求x取什么值的时候,$ \sum_{i=1}^n |a_i*x+b_i| =C $,要求求出解的个数,并用最简分数从小到大表示,如果有无穷多解,输出-1. 题 ...

  8. hdu多校第五场1007 (hdu6630) permutation 2 dp

    题意: 给你n个数,求如下限制条件下的排列数:1,第一位必须是x,2,最后一位必须是y,3,相邻两位之差小于等于2 题解: 如果x<y,那么考虑把整个数列翻转过来,减少讨论分支. 设dp[n]为 ...

  9. hdu多校第三场 1006 (hdu6608) Fansblog Miller-Rabin素性检测

    题意: 给你一个1e9-1e14的质数P,让你找出这个质数的前一个质数Q,然后计算Q!mod P 题解: 1e14的数据范围pass掉一切素数筛法,考虑Miller-Rabin算法. 米勒拉宾算法是一 ...

随机推荐

  1. vue static和assets的区别

    static和assets的区别,原理就在于webpack是如何处理静态资源的 assets 1)在vue组件中,所有模板和css都会被vue-html-loader和css-loader解析,并查找 ...

  2. 谷歌浏览器srcoll时,控制台一直报错

    如果是使用betheme-child主题,在wp后台去掉这个srcoll插件 目录是wp后台的Betheme——Theme Options——Addons & Plugins——Addons— ...

  3. php phpword生成html页面

    先说下需求:正常点击免责声明是下载的文件,根据用户需求是点击预览,所以这里利用phpword生成一个静态页面并进行预览.不多说,直接上代码附带类文件. 类文件:https://pan.baidu.co ...

  4. psecurity配置

    <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.spr ...

  5. Shiro学习(2)身份验证

    身份验证,即在应用中谁能证明他就是他本人.一般提供如他们的身份ID一些标识信息来表明他就是他本人,如提供身份证,用户名/密码来证明. 在shiro中,用户需要提供principals (身份)和cre ...

  6. luoguP2590 [ZJOI2008]树的统计 [树链剖分] [TLE的LCT]

    题目描述 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w. 我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把结点u的权值改为t II. QMAX u ...

  7. 【Dart学习】-- Dart之注释

    Dart支持三种注释类型: 单行注释,多行注释,文档注释. 单行注释单行注释以//开头,从//开始到一行结束的所有内容都会被Dart编译器忽略,示例代码如下: main(){ //打印输出 print ...

  8. libvert开启TCP监听

    1.设置libvirtd 编辑/etc/libvirt/libvirtd.conf listen_tls = 0 listen_tcp = 1 auth_tcp="none" tc ...

  9. Neo4j原生语句cc

    Cypher语句 Cypher语句是Neo4j的图查询语言.以下例子来自Neo4j Browser,启动后在命令栏输入:play cypher即可1. 创建一个节点: 语法:CREATE (node- ...

  10. 京东云Ubuntu下安装mysql

    1.sudo apt-get install mysql-server,输入y后输入密码 2.sudo apt isntall mysql-client 3.sudo apt install libm ...