bzoj3530

比较恶心的题目
不难发现是在自动机上做数位dp
注意要考虑前导0,题目中给出的233是幸运数,20233不是
为此我非常猥琐的写了一个四维dp,用记忆化搜索实现

  1 const mo=1000000007;
  2 var dp:array[0..1,0..1,0..1205,0..1505] of longint;
  3     trie:array[0..2005,'0'..'9'] of longint;
  4     q,f:array[0..2005] of longint;
  5     can:array[0..2005] of boolean;
  6     ans,i,n,m,t,j,k,l:longint;
  7     s,ss:ansistring;
  8     ch:char;
  9 
 10 procedure ac;
 11   var h,r,i,x,y:longint;
 12       c:char;
 13   begin
 14     h:=1;
 15     r:=0;
 16     for c:='0' to '9' do
 17       if trie[0,c]>0 then
 18       begin
 19         inc(r);
 20         q[r]:=trie[0,c];
 21       end;
 22 
 23     while h<=r do
 24     begin
 25       x:=q[h];
 26       for c:='0' to '9' do
 27         if trie[x,c]>0 then
 28         begin
 29           y:=trie[x,c];
 30           inc(r);
 31           q[r]:=y;
 32           j:=f[x];
 33           while (j>0) and (trie[j,c]=0) do j:=f[j];
 34           f[y]:=trie[j,c];
 35           if can[trie[j,c]] then can[y]:=true; //注意
 36         end;
 37       inc(h);
 38     end;
 39   end;
 40 
 41 function calc(p,z,i,j:longint):longint; //p表示当前位置上的数是否需要小于N当前位上的数
 42                                         //z表示假如当前位出现0,是否是多余的0  
 43   var k,q,zz:longint;
 44       s,c,e:char;
 45   begin
 46     if can[j] then exit(0);
 47     if i=m then exit(1);
 48     if dp[p,z,i,j]<>-1 then exit(dp[p,z,i,j]);
 49     dp[p,z,i,j]:=0;
 50     if p=0 then e:=ss[i+1] else e:='9';
 51     for c:='0' to e do
 52     begin
 53       if (p=0) and (c=e) then q:=0
 54       else q:=1;
 55       k:=j;
 56       while k>-1 do
 57       begin
 58         if trie[k,c]>0 then break;
 59         k:=f[k];
 60       end;
 61       if k=-1 then k:=0 else k:=trie[k,c];
 62       if (z=0) and (c='0') then  //开头多余的0不考虑
 63       begin
 64         zz:=0;
 65         k:=0;  //多余的0不在自动机上匹配
 66       end
 67       else zz:=1;
 68       dp[p,z,i,j]:=(dp[p,z,i,j]+calc(q,zz,i+1,k)) mod mo;
 69     end;
 70     exit(dp[p,z,i,j]);
 71   end;
 72 
 73 begin
 74   read(ch);
 75   while ch='0' do read(ch);
 76   readln(ss);
 77   ss:=ch+ss;
 78   m:=length(ss);
 79   f[0]:=-1;
 80   readln(n);
 81   for i:=1 to n do
 82   begin
 83     readln(s);
 84     j:=0;
 85     l:=length(s);
 86     for k:=1 to l do
 87     begin
 88       if trie[j,s[k]]=0 then
 89       begin
 90         inc(t);
 91         trie[j,s[k]]:=t;
 92       end;
 93       j:=trie[j,s[k]];
 94     end;
 95     can[j]:=true;
 96   end;
 97   ac;
 98   fillchar(dp,sizeof(dp),255);
 99   ans:=(calc(0,0,0,0)-1+mo) mod mo;
100   writeln(ans);
101 end.
View Code

 

转载于:https://www.cnblogs.com/phile/p/4472996.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值