【Wannafly挑战赛9-B】数一数

链接:https://www.nowcoder.net/acm/contest/71/B

题目就不贴了。。

设res[i]为第i行的最终结果,可以想到,res[i]为0或不为0。长度不是最短的字符串res一定0,因为res是所有子串数量的乘积,对于每个字符串,只有长度最短的字符串乘过之后才会有结果,其余的res都是0。有多个长度最短的,结果都一样,总之...看代码就懂了(逃。之后就是KMp了(好长时间没复习kmp都忘了惹Σ(゚д゚;)

 

上代码:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef long long LL;
 4 const int mod = 998244353;
 5 const int N = 1e6+3;
 6 string s[N];
 7 char s1[N*2];
 8 int id[N], Next[N*2];
 9 LL res[N];
10 void make(string s, int m)
11 {
12     int i, j;
13     for(i=1, j=0; i<m; i++)
14     {
15         while(j > 0 && s[i] != s[j])
16             j = Next[j-1];
17         if(s[i] == s[j])
18             j++;
19         Next[i] = j;
20     }
21 }
22 int kmp(string s1, string s2)
23 {
24     int i, j, num = 0;
25     int l1 = s1.size();
26     int l2 = s2.size();
27     Next[0] = 0;
28     make(s1, l1);
29     for(i = 0, j = 0; i < l2; i++)
30     {
31         while(j > 0 && s1[j] != s2[i])
32             j = Next[j-1];
33         if(s1[j] == s2[i])
34             j++;
35         if(j == l1)
36         {
37             num++;
38             j = Next[j-1];
39         }
40     }
41     return num;
42 }
43 int main()
44 {
45     int n, i, j;
46     cin>>n;
47     for(i = 1; i <= n; i++)
48     {
49         scanf("%s", s1);
50         s[i] = s1;
51         id[i] = i;//用id标号来给长度从小到大排序
52     }
53     sort(id+1, id+1+n, [](int x, int y){return s[x]. size()<s[y].size();});//又学会一种偷懒+的写法(°∀°)ノ
54     int m = s[id[1]].size();
55     res[id[1]] = 1;
56     for(j = 2; j <= n; j++)
57         res[id[1]] = (res[id[1]]*kmp(s[id[1]], s[j])%mod)%mod;
58     for(i = 2; i <= n; i++)
59     {
60         if(s[id[i]].size() != m) break;
61         if(s[id[i]].size() == m) res[id[i]] = res[id[1]];
62     }
63     for(i = 1; i <= n; i++)
64         printf("%lld\n", res[i]);
65     return 0;
66 }
View Code

 

转载于:https://www.cnblogs.com/lesroad/p/8432885.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
牙科就诊管理系统利用当下成熟完善的SSM框架,使用跨平台的可开发大型商业网站的Java语言,以及最受欢迎的RDBMS应用软件之一的Mysql数据库进行程序开发。实现了用户在线查看数据。管理员管理病例管理、字典管理、公告管理、药单管理、药品管理、药品收藏管理、药品评价管理、药品订单管理、牙医管理、牙医收藏管理、牙医评价管理、牙医挂号管理、用户管理、管理员管理等功能。牙科就诊管理系统的开发根据操作人员需要设计的界面简洁美观,在功能模块布局上跟同类型网站保持一致,程序在实现基本要求功能时,也为数据信息面临的安全问题提供了一些实用的解决方案。可以说该程序在帮助管理者高效率地处理工作事务的同时,也实现了数据信息的整体化,规范化与自动化。 管理员在后台主要管理病例管理、字典管理、公告管理、药单管理、药品管理、药品收藏管理、药品评价管理、药品订单管理、牙医管理、牙医收藏管理、牙医评价管理、牙医挂号管理、用户管理、管理员管理等。 牙医列表页面,此页面提供给管理员的功能有:查看牙医、新增牙医、修改牙医、删除牙医等。公告信息管理页面提供的功能操作有:新增公告,修改公告,删除公告操作。公告类型管理页面显示所有公告类型,在此页面既可以让管理员添加新的公告信息类型,也能对已有的公告类型信息执行编辑更新,失效的公告类型信息也能让管理员快速删除。药品管理页面,此页面提供给管理员的功能有:新增药品,修改药品,删除药品。药品类型管理页面,此页面提供给管理员的功能有:新增药品类型,修改药品类型,删除药品类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值