HDU-6194 string string string
求一个字符串中正好出现了K次的子串,可以用后缀自动机来做
附上后缀自动机的应用:https://blog.csdn.net/clover_hxy/article/details/68059043
以及代码出处:https://www.cnblogs.com/forever97/p/hdu6194.html
本来套了个kuangbin模板,提交结果内存爆了,因为用的都是指针(64位系统指针占用空间比int大)
就直接套用别人写的代码了
写这题刚学习了后缀自动机的结构和构造,勉强理解了大概
后缀自动机的用处很多,以后要多做一些应用题,加深理解
#include <cstdio>
#include<iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int N=200010;
char s[N];
struct SAM{int p,q,np,nq,cnt,lst,a[N][26],l[N],f[N],tot;int Tr(char c){return c-'a';}int val(int c){return l[c]-l[f[c]];} SAM(){cnt=0;lst=++cnt;}void Initialize(){memset(l,0,sizeof(int)*(cnt+1));memset(f,0,sizeof(int)*(cnt+1));for(int i=0;i<=cnt;i++)for(int j=0;j<26;j++)a[i][j]=0;cnt=0;lst=++cnt;}void extend(int c){p=lst;np=lst=++cnt;l[np]=l[p]+1;while(!a[p][c]&&p)a[p][c]=np,p=f[p];if(!p){f[np]=1;}else{q=a[p][c];if(l[p]+1==l[q])f[np]=q;else{nq=++cnt;l[nq]=l[p]+1;memcpy(a[nq],a[q],sizeof(a[q]));f[nq]=f[q]; f[np]=f[q]=nq;while(a[p][c]==q)a[p][c]=nq,p=f[p];}}}int b[N],x[N],r[N];void build(int len){Initialize();for(int i=1;i<=len;i++)extend(Tr(s[i]));}void solve(){int ans=0,k;scanf("%d",&k);scanf("%s",s+1); //从下标1开始int len=strlen(s+1);build(len);memset(r,0,sizeof(int)*(cnt+1));memset(b,0,sizeof(int)*(cnt+1));for(int i=1;i<=cnt;i++)b[l[i]]++;for(int i=1;i<=len;i++)b[i]+=b[i-1];for(int i=1;i<=cnt;i++)x[b[l[i]]--]=i;for(int i=p=1;i<=len;i++){p=a[p][Tr(s[i])];r[p]++;}for(int i=cnt;i;i--)r[f[x[i]]]+=r[x[i]];for(int i=1;i<=cnt;i++)if(r[x[i]]==k)ans+=val(x[i]);printf("%d\n",ans);}
}sam;
int T;
int main(){scanf("%d",&T);while(T--){sam.solve();}return 0;
}
HDU-6194 string string string相关推荐
- HDU 6194:string string string
参考博客:HDU 6194 string string string (2017沈阳网赛-后缀数组) 下面题解来自该博客 题意: 告诉你一个字符串和k , 求这个字符串中有多少不同的子串恰好出现了k ...
- HDU 6194 string string string
HDU 6194 输入一个字符串,求出现K次得子串个数 我的做法是求出大于等于K次的子串个数-大于等于K+1次的子串个数 #include <stdio.h> #include <s ...
- HDU 6194 string string string :后缀数组+单调队列 | 后缀自动机
题意:给出一个字符串,求出出现了恰好k次的子串的个数. 题解:恰好k次 = 至少k次 - 至少k+1次.答案转化为求至少出现k次的子串个数统计.构造好后缀数组以及很重要的Height数组之后.用一个k ...
- hdu 6086 Rikka with String(AC自动机+状压dp)
题目链接:hdu 6086 Rikka with String 题意: 给你n个只含01的串,和一个长度L,现在让你构造出满足s[i]≠s[|s|−i+1] for all i∈[1,|s|] ,长度 ...
- static string java_java:String类、static关键字、Arrays类、 Math类
public voidStrMethodTest(){/** public int length () :返回此字符串的长度. * public String concat (String str) ...
- 转换ArrayList String 到String []数组[重复]
本文翻译自:Convert ArrayList to String[] array [duplicate] This question already has an answer here: 这个问题 ...
- C#中的String和string有什么区别?还有ref关键字怎么用?
String 和 string 没有区别 string 是 String 的别名 ref 关键字一般只用于函数参数中,这个参数是 struct 类型,而不是 class 类型 因为 class 类型在 ...
- shell中$后加引号有什么用($string和$'string')
bash&shell系列文章:http://www.cnblogs.com/f-ck-need-u/p/7048359.html 有些时候在某些服务管理脚本中看到$"$string& ...
- 【错误记录】Kotlin 编译报错 ( Type mismatch: inferred type is String? but String was expected )
文章目录 一.报错信息 二.解决方案 一.报错信息 Google Play 上架要求 Android 的编译版本 和 目标版本都要高于 30 才可以上传 ; 将 Android 的编译版本 和 目标版 ...
- C#String与string大小写的区别
1.string是c#中的类,String是.net Framework的类(在c# IDE中不会显示蓝色) 2.C# string映射为.net Framework的String 3.如果用 ...
最新文章
- 外贸网络推广分享让网站文章标题优化效果更好地小技巧!
- 004_Queue消息模式发送文本消息
- Oracle编程入门经典 第9章 掌握SQL*Plus
- Ubuntu 默认输入法切换(更改)--- 解决中文输入问题
- 我是一位老师,讲课是我的乐趣,可是……
- JAVA8的学习笔记之Collection
- System Center Operations Manager 简介 [SCOM中文系列之一]
- IIS7里的appcmd命令
- Luogu4114 Qtree1
- CPU自制入门 第三章 编程
- python 将微信聊天记录生成词云
- poi根据模版生成多页word,并压缩下载
- 吃瓜 || 一文看懂BCH分叉事件始末
- AXI总线学习-------从零开始详细学-------------连载(7)读写处理架构,burst介绍,burst细节定义(burst type burst address)
- Fn按键失灵后的软件替代方案
- 秋招Java开发工程师笔试_美团Java工程师面试题(2018秋招)
- python基础分析_数据分析之Python基础
- 用 M1 MacBook 当主力开发机:程序员使用半个月后如是说
- 拟真机器人拯救者奖励_《X战警:黑队》万磁王大战哨兵机器人,他就是变种人的拯救者!...
- 戚风蛋糕,华丽的转身——演绎失败与成功的大转变
热门文章
- JavaWeb开发 —— Maven
- 解决“事件ID(487)的描述(在资源(Zend Optimizer)中)无法找到”问题
- JVM3:实战:内存分配与回收策略
- 各大平台免费接口,非常适用
- 过勇 清华计算机系,16位清华学霸的简历—比你牛的人还比你努力,膝盖已跪碎...
- Handler---
- Java设计模式策略模式(附实例代码)每天一学设计模式
- DB2 元换算成万元 (除以/10000)
- 非线性回归算法--学习笔记
- 韩顺平Oracle笔记