牛客练习赛70 B.拼凑 (序列自动机)
2024-10-19 04:40:16
题意:有一个模板串,有\(T\)个字符串,从字符串中找到某个子串,使得这个子串中的子序列包含模板串,求最短的子串的长度.
题解:找子序列,很容易想到序列自动机,根据序列自动机的原理,我们一定可以确保除了第一个字符,其他的字符的位置都是最优的,所以我们先对模板串的第一个字符\(p\)记录它的所有位置,然后再遍历它的位置,每次都跑一下序列自动机维护答案的最小值即可.
代码:
const string p="puleyaknoi"; int t;
string s;
vector<int> v[N];
vector<int> cnt; int main() {
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
cin>>t;
while(t--){
cin>>s;
cnt.clear();
int len=(int)s.size();
for(int i=0;i<len;++i){
int num=s[i]-'0';
v[num].pb(i);
}
for(int i=0;i<len;++i){
if(s[i]=='p') cnt.pb(i);
}
bool flag=false;
int res=INF;
for(auto w:cnt){
int pos=w;
for(int i=1;i<10;++i){
int num=p[i]-'0';
auto now=lower_bound(v[num].begin(),v[num].end(),pos+1);
if(now==v[num].end()){
break;
}
else pos=*now;
if(i==9){
flag=true;
res=min(res,pos-w+1);
}
}
}
if(!flag) cout<<-1<<endl;
else cout<<res<<endl; for(auto w:s){
int num=w-'0';
v[num].clear();
}
} return 0;
}
最新文章
- 深入C#编程
- Xamarin.Android和UWP之MVVM的简单使用(二)
- 单例模式(singleton)
- (python)对象的引用
- 测试架构图 High Level 产品技术(无事来更新,证明这个博客还是Live的)
- Codeforces 633C Spy Syndrome 2(DP + Trie树)
- Least Common Ancestors 分类: ACM TYPE 2014-10-19 11:24 84人阅读 评论(0) 收藏
- vi常用命令与设置(不断修改中)
- 【HDOJ】3277 Marriage Match III
- java利用反射调用类的某个方法
- Android尽量避免使用开发jpg图片
- PHP 6:PHP 基本数据类型
- 浅谈MySQL集群高可用架构
- 【翻译】将Ext JS Grid转换为Excel表格
- Java设计模式视频讲解
- .NET CORE学习笔记系列(1)——ASP.NET MVC Core 介绍和项目解读
- 【Eclipse】-NO.163.Eclipse.1 -【Eclipse springboot 1.x 创建maven工程初始化报错】
- django部署笔记
- 路由网关---zuul
- 使用sshpass方式实现ssh自动登录
热门文章
- PAT天梯赛练习 L3-004 肿瘤诊断 (30分) 三维BFS
- mongodb表索引备份,索引的导出导入
- Centos 6 下安装 OSSEC-2.8.1 (一)
- kubernets之secret资源
- 7行代码解决P1441砝码称重(附优化过程)
- 解决MyBatis-Plus 3.3.1中自动生成代码tinyint(1)无法自动转换为Boolean 的办法
- CentOS 7.4通过rpm包离线安装 Mysql8.0并部署主从复制(附从库备份脚本)
- 转 12 jmeter性能测试实战--web程序
- Mybatis参数预编译
- 【LinxuShell】tar命令的用法