hdu 4333 扩展kmp+kmp重复字串去重
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4333
关于kmp next数组求最短重复字串问题请看;http://www.cnblogs.com/z1141000271/p/7406198.html
扩展kmp请看:http://www.cnblogs.com/z1141000271/p/7404717.html
题目大意:一个数字,依次将第一位放到最后一位,问小于本身的数的个数及等于本身的个数和大于本身的个数,但是要注意重复的不再计算
题解:我们把得到的串double一下(比如s=aa double之后 s=aaaa),然后对double之后得到的串做一个次扩展kmp,然后便利得到的Next数组。如果公共前缀匹配>=原串长度则e++,对于公共前缀小于原串长度的,我们去比较失配的第一位就可以了。再就是去重的问题,这个要注意!如果原串可以由更小的串重复得到,那我们计算的结果就有很多重复的。
(注意double 以及去重两个操作的使用)
ac代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#define mt(a) memset(a,0,sizeof(a))
using namespace std;
typedef long long ll;
const ll mod=1e9+;
int extend[];
int Next[];
int min(int x,int y)
{
if(x>y) return y;
return x;
}
int knext[];
void getknext(char s[],int len)
{
mt(knext);
int i=;
int j=-;
knext[i]=j;
while(i<len)
{
if(j==- || s[i]==s[j]) knext[++i]=++j;
else j=knext[j];
}
}
void getNext(char t[],int len)
{
mt(Next);
//ll len=strlen(t);
Next[]=len;
int a,p;
a=;
while( a<len && t[a]==t[a-]) a++; // 求出长度为1的时候 解为多少
Next[]=a-;
a=;
for(int 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;
}
}
}
char s[];// s->exkmp t->Next
int main()
{
int Case;
scanf("%d",&Case);
for(int z=;z<=Case;z++)
{
scanf("%s",s);
int len=strlen(s);
int j=;
int l,e,g;
getknext(s,len);
int temp=len-knext[len]; // 最小重复长度
if(len%temp) temp=;
else temp=len/temp; for(int i=;i<len;i++)
{
s[len+i]=s[i];
}
getNext(s,*len);
l=e=g=;
for(int i=;i<len;i++)
{
if(Next[i]>=len) e++;
else
{
int temp=i+Next[i];// postion of not match
if(s[temp]<s[Next[i]]) l++;
else if(s[temp]>s[Next[i]])g++;
}
}
printf("Case %d: %d %d %d\n",z,l/temp,e/temp,g/temp);
}
return ;
}
hdu 4333 扩展kmp+kmp重复字串去重的更多相关文章
- leetcode-3 最长无重复字串
3. Longest Substring Without Repeating Characters 题面 Given a string, find the length of the longest ...
- hdu 4333(扩展kmp)
题意:就是给你一个数字,然后把最后一个数字放到最前面去,经过几次变换后又回到原数字,问在这些数字中,比原数字小的,相等的,大的分别有多少个.比如341-->134-->413-->3 ...
- POJ - 2406 ~SPOJ - REPEATS~POJ - 3693 后缀数组求解重复字串问题
POJ - 2406 题意: 给出一个字符串,要把它写成(x)n的形式,问n的最大值. 这题是求整个串的重复次数,不是重复最多次数的字串 这题很容易想到用KMP求最小循环节就没了,但是后缀数组也能写 ...
- hdu 4333"Revolving Digits"(KMP求字符串最小循环节+拓展KMP)
传送门 题意: 此题意很好理解,便不在此赘述: 题解: 解题思路:KMP求字符串最小循环节+拓展KMP ①首先,根据KMP求字符串最小循环节的算法求出字符串s的最小循环节的长度,记为 k: ②根据拓展 ...
- [模拟赛FJOI Easy Round #2][T1 sign] (模拟+求字符串重复字串)
[题目描述] 小Z在无意中发现了一个神奇的OJ,这个OJ有一个神奇的功能:每日签到,并且会通过某种玄学的算法计算出今日的运势.在多次试验之后,小Z发现自己的运势按照一定的周期循环,现在他找到了你,请通 ...
- poj 2406 求最短重复字串
题解: KMP中next数组的巧妙运用.在这里我们假设这个字符串的长度是len,那么如果len可以被len-next[len]整除的话,我们就可以说len-next[len]就是那个最短子串的长度为什 ...
- 【LeetCode每天一题】Longest Substring Without Repeating Characters(最长无重复的字串)
Given a string, find the length of the longest substring without repeating characters. Example 1: ...
- 字符串(扩展KMP):HDU 4333 Revolving Digits
Revolving Digits Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- hdu 1358 Period(kmp求一个串的重复子串)
题意:统计单串中从某个位置以前有多少重复的串 思路:kmp模板 #include<iostream> #include<stdio.h> #include<string. ...
随机推荐
- error: cannot connect to daemon解决办法
本文链接:https://blog.csdn.net/ipinki1218/article/details/80704806运行adb shell时出现error: cannot connect to ...
- python __new__
1.__new__的作用是什么? 依照Python官方文档的说法,__new__方法主要是当你继承一些不可变的class时(比如int, str, tuple), 提供给你一个自定义这些类的实例化过程 ...
- hystrix流程图收藏
最近在看张开涛的亿级流量的书,学习了一个新的防雪崩的功能hystrix,在学习这个功能的过程中,看了一些网站也温习了一些知识,例如double_check locking功能,还有cache的击穿作为 ...
- leetcode 62. Unique Paths 、63. Unique Paths II
62. Unique Paths class Solution { public: int uniquePaths(int m, int n) { || n <= ) ; vector<v ...
- SQL-W3School-函数:SQL GROUP BY 语句
ylbtech-SQL-W3School-函数:SQL GROUP BY 语句 1.返回顶部 1. 合计函数 (比如 SUM) 常常需要添加 GROUP BY 语句. GROUP BY 语句 GROU ...
- 阶段5 3.微服务项目【学成在线】_day18 用户授权_19-微服务之间认证-Feign 拦截器
4.2 Feign 拦截器 4.2.1 定义Feign拦截器 微服务之间使用feign进行远程调用,采用feign拦截器实现远程调用携带JWT. 在common工程添加依赖: <dependen ...
- C++线程互斥、同步
一.线程互斥 如果多个线程需要访问且可能修改同一个变量,那么需要加锁,保证同一时刻只有一个线程可以访问,这个动作即最小“原子操作” 方式1: 使用c++提供的类mutex,lock,unlock即可 ...
- python面试必备-基础篇
一.python中and, or, and-or语法 1.and 有假先出假 在Python 中,and 和 or 执行布尔逻辑演算,如你所期待的一样,但是它们并不返回布尔值:而是,返回它们实际进 ...
- PAT 甲级 1033 To Fill or Not to Fill (25 分)(贪心,误以为动态规划,忽视了油量问题)*
1033 To Fill or Not to Fill (25 分) With highways available, driving a car from Hangzhou to any oth ...
- PHP和MySQL.Web开发(原书第4版)学习盲点笔记
1.浏览器输出中文乱码解决: <?php header("Content-type: text/html; charset=utf-8"); ?> 相当于html中的: ...