bzoj 4598: [Sdoi2016]模式字符串

题目描述

给出n个结点的树结构T,其中每一个结点上有一个字符,这里我们所说的字符只考虑大写字母A到Z,再给出长度为m的模式串s,其中每一位仍然是A到z的大写字母。

Alice希望知道,有多少对结点<u,v>满足T上从u到V的最短路径形成的字符串可以由模式串S重复若干次得到?

这里结点对<u,v>是有序的,也就是说<u,v>和<v,u>需要被区分。

所谓模式串的重复,是将若干个模式串S依次相接(不能重叠)。例如当S=PLUS的时候,重复两次会得到PLUSPLUS,重复三次会得到PLUSPLUSPLUS,同时要注恿,重复必须是整数次的。例如当S=XYXY时,因为必须重复整数次,所以XYXYXY不能看作是S重复若干次得到的。

输入输出格式

输入格式:

每一个数据有多组测试,

第一行输入一个整数C,表示总的测试个数。

对于每一组测试来说:

第一行输入两个整数,分别表示树T的结点个数n与模式长度m。结点被依次编号为1到n,

之后一行,依次给出了n个大写字母(以一个长度为n的字符串的形式给出),依次对应树上每一个结点上的字符(第i个字符对应了第i个结点)。

之后n-1行,每行有两个整数u和v表示树上的一条无向边,之后一行给定一个长度为m的由大写字母组成的字符串,为模式串S。

输出格式:

给出C行,对应C组测试。

每一行输出一个整数,表示有多少对节点<u,v>满足从u到v的路径形成的字符串恰好是模式串的若干次重复.

输入输出样例

输入样例#1: 复制
1
11 4
IODSSDSOIOI
1 2
2 3
3 4
1 5
5 6
6 7
3 8
8 9
6 10
10 11
SDOI
输出样例#1: 复制
5

说明

1<=C<=10,3<=N<=1000000,3<=M<=1000000

题解

  题解大概看懂一点了……就是说用hash+点分治……好讨厌hash……总感觉还是半懂不懂……

  考虑每一个分治点,从他延伸下去能形成长度为多少的前缀和后缀(不包含自己和包含自己),然后两个两两组合起来计算答案

  据说时间复杂度$O(Tnlogn)$,数据就是为了卡点分的,然而因为全世界都只有前三组数据……所以能A……

  1 //minamoto
  2 #include<cstdio>
  3 #include<iostream>
  4 #include<cstring>
  5 #define N 1000003
  6 #define ull unsigned long long
  7 #define ll long long
  8 #define p 2000001001
  9 #define inf 1000000000
 10 using namespace std;
 11 template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
 12 inline int read(){
 13     #define num ch-'0'
 14     char ch;bool flag=0;int res;
 15     while(!isdigit(ch=getchar()))
 16     (ch=='-')&&(flag=true);
 17     for(res=num;isdigit(ch=getchar());res=res*10+num);
 18     (flag)&&(res=-res);
 19     #undef num
 20     return res;
 21 }
 22 char sr[1<<21],z[30];int C=-1,Z;
 23 inline void Ot(){fwrite(sr,1,C+1,stdout),C=-1;}
 24 inline void print(ll x){
 25     if(C>1<<20)Ot();if(x<0)sr[++C]=45,x=-x;
 26     while(z[++Z]=x%10+48,x/=10);
 27     while(sr[++C]=z[Z],--Z);sr[++C]='\n';
 28 }
 29 int n,m,T,n1,rt,head[N],Next[N<<1],ver[N<<1],tot,size[N],son[N],sz,sz1;
 30 int st[N],st1[N],len[N],cnt[N],cnt1[N];
 31 ull mi[N],a[N],a1[N],b[N],c[N],val[N],sum[N],sum1[N];
 32 ll ans;
 33 bool vis[N];char s[N];
 34 inline void add(int u,int v){
 35     ver[++tot]=v,Next[tot]=head[u],head[u]=tot;
 36     ver[++tot]=u,Next[tot]=head[v],head[v]=tot;
 37 }
 38 void findrt(int u,int fa){
 39     size[u]=1,son[u]=0;
 40     for(int i=head[u];i;i=Next[i]){
 41         int v=ver[i];
 42         if(vis[v]||v==fa) continue;
 43         findrt(v,u);
 44         cmax(son[u],size[v]);
 45         size[u]+=size[v];
 46     }
 47     cmax(son[u],n1-size[u]);
 48     if(son[u]<son[rt]) rt=u;
 49 }
 50 void getdep(int u,int fa){
 51     if(b[len[u]]==sum[u]&&val[u]==a[1]) st[++sz]=u;
 52     for(int i=head[u];i;i=Next[i]){
 53         int v=ver[i];if(vis[v]||v==fa) continue;
 54         sum[v]=sum[u]*p+val[v];
 55         len[v]=len[u]+1;
 56         getdep(v,u);
 57     }
 58 }
 59 void getdep1(int u,int fa){
 60     if(c[len[u]]==sum1[u]&&val[u]==a1[1]) st1[++sz1]=u;
 61     for(int i=head[u];i;i=Next[i]){
 62         int v=ver[i];
 63         if(vis[v]||v==fa) continue;
 64         sum1[v]=sum1[u]*p+val[v];
 65         getdep1(v,u);
 66     }
 67 }
 68 void calc(int u){
 69     for(int i=0;i<=m;++i) cnt[i]=cnt1[i]=0;
 70     if(a[1]==val[u]) cnt[1]=1;
 71     if(a[m]==val[u]) cnt1[1]=1;
 72     if(m==1) ans+=cnt1[1];
 73     for(int i=head[u];i;i=Next[i]){
 74         int v=ver[i];
 75         if(vis[v]) continue;
 76         sz=0,len[v]=1,sum[v]=val[v];
 77         getdep(v,u);
 78         for(int j=1;j<=sz;++j){
 79             int t=st[j];int pos=m-(len[t]-1)%m-1;
 80             if(pos==0) pos+=m;
 81             ans+=(ll)cnt1[pos];
 82         }
 83         sz1=0,sum1[v]=val[v];
 84         getdep1(v,u);
 85         for(int j=1;j<=sz1;++j){
 86             int t=st1[j];int pos=m-(len[t]-1)%m-1;
 87             if(pos==0) pos+=m;
 88             ans+=(ll)cnt[pos];
 89         }
 90         for(int j=1;j<=sz;++j){
 91             int t=st[j];int pos=(len[t])%m+1;
 92             if(val[u]==a[pos]) ++cnt[pos];
 93         }
 94         for(int j=1;j<=sz1;++j){
 95             int t=st1[j];int pos=(len[t])%m+1;
 96             if(val[u]==a1[pos]) ++cnt1[pos];
 97         }
 98     }
 99 }
100 void solve(int u){
101     calc(u),vis[u]=1;int totsz=size[u];
102     for(int i=head[u];i;i=Next[i]){
103         int v=ver[i];
104         if(vis[v]) continue;
105         rt=0;
106         n1=size[v];
107         if(n1<m) continue;
108         findrt(v,u);
109         solve(rt);
110     }
111 }
112 int main(){
113     T=read(),mi[0]=1;
114     for(int i=1;i<=1000000;++i) mi[i]=mi[i-1]*p;
115     while(T--){
116         n=read(),m=read(),tot=0,ans=0;
117         memset(head,0,sizeof(head));
118         scanf("%s",s+1);
119         for(int i=1;i<=n;++i) val[i]=s[i]-'A'+1;
120         for(int i=1;i<n;++i){
121             int u=read(),v=read();add(u,v);
122         }
123         scanf("%s",s+1);
124         for(int i=1;i<=max(n,m);++i) a[i]=s[(i-1)%m+1]-'A'+1;
125         for(int i=1;i<=max(n,m);++i) b[i]=b[i-1]+a[i]*mi[i-1];
126         for(int i=1;i<=m;++i) a1[m-i+1]=a[i];
127         for(int i=1;i<=max(n,m);++i) a1[i]=a1[(i-1)%m+1];
128         for(int i=1;i<=max(n,m);++i) c[i]=c[i-1]+a1[i]*mi[i-1];
129         memset(vis,0,sizeof(vis));
130         son[0]=inf,rt=0,n1=n;
131         findrt(1,0);
132         solve(rt);
133         print(ans);
134     }
135     Ot();
136     return 0;
137 }

 

转载于:https://www.cnblogs.com/bztMinamoto/p/9492759.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/279582.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[译] 机器学习可以建模简单的数学函数吗?

原文地址&#xff1a;Can Machine Learning model simple Math functions?原文作者&#xff1a;Harsh Sahu译文出自&#xff1a;掘金翻译计划本文永久链接&#xff1a;github.com/xitu/gold-m…译者&#xff1a;Minghao23校对者&#xff1a;lsvih&#xff0c;zoomdong机器学习…

下载spotify音乐_如何在Spotify上播放更高质量的音乐

下载spotify音乐With Spotify Premium, you get access to higher quality music streaming. By default (and if you’re on the free plan), Spotify streams at 96kbps on mobile and 160kbps on your computer. At these sort of bitrates, you’ll hear a small but notic…

ubuntu scp命令或者用root连接ssh提示:Permission denied, please try again.错误

1、su -            #&#xff01;&#xff01;&#xff01; 2、vi /etc/ssh/sshd_config 3、PermitRootLogin yes    # 找到此字段&#xff0c;改为此行所示 4、/etc/init.d/ssh restart    # 重启ssh服务 转载于:https://www.cnblogs.com/weiyiming007/p…

Windows下压缩包安装Mysql

1. 下载mysql压缩包 2. 解压到指定目录&#xff0c;例如D:\Program Files\mysql-5.7.25-winx64 3. 在目录下创建配置文件my.ini [mysqld] port 3306 basedirD:/Program Files/mysql-5.7.25-winx64 datadirD:/Program Files/mysql-5.7.25-winx64/data max_connections200 char…

如何从终端打开Ubuntu Nautilus文件浏览器

Recently, we showed you how to open a directory in Terminal from within Nautilus. However, what if you’re working on the command line in Terminal and need to access the same directory in Nautilus? There’s an easy solution for that. 最近&#xff0c;我们向…

mysql 面试知识点笔记(七)RR如何避免幻读及非阻塞读、范式

2019独角兽企业重金招聘Python工程师标准>>> 表象&#xff1a;快照读&#xff08;非阻塞读&#xff09;--伪MVCC &#xff08;Multi-Version Concurrent Controll多版本并发控制&#xff09; 内在&#xff1a;next-key锁(record锁gap锁) rr serializabel 都支持gap锁…

pdf 奇数页插入页码_如何在Word 2013中的奇数页码上启动新部分

pdf 奇数页插入页码When working on a long document or a book in Word, it’s common to divide the document into sections or chapters. A common practice is to start each new section or chapter on an odd page. This is easily accomplished using sections in Word…

彻底攻克C语言指针

前面我们讲解了指针数组、二维数组指针、函数指针等几种较为复杂的指针&#xff0c;它们的定义形式分别是&#xff1a; int *p1[6]; //指针数组int *(p2[6]); //指针数组&#xff0c;和上面的形式等价int (*p3)[6]; //二维数组指针int (*p4)(int, int); //函数指针我相信大部分…

流水线上的思考——异步程序开发模型(2)

上一期我们讲了一个简单的流水线处理流程&#xff0c;正如我们在上期最后所说那样&#xff0c;这个简单的流水线处理流程对于后续有慢设备操作的业务来说&#xff0c;性能有可能偏低。今天我们来讨论一下如何提高性能的方法。首先让我们来大致区分一下一般业务的处理方式。目前…

java ReentrantLock 锁相关笔记

为什么80%的码农都做不了架构师&#xff1f;>>> ReentrantLock重入锁简单理解就是对同一个线程而言&#xff0c;它可以重复的获取锁。例如这个线程可以连续获取两次锁&#xff0c;但是释放锁的次数也一定要是两次 Lock locknew ReentrantLock(true);//公平锁 Lock …

计算机启动程序bios_如何构建自己的计算机,第三部分:准备BIOS

计算机启动程序biosSo you’ve carefully picked out some parts and built a computer, but it doesn’t really do anything…yet. Before we hop into installing your operating system, we need to take a quick look at the BIOS and prepare it for our operating syste…

PLSQL 之类型、变量和结构

1、类型 在《.Net程序员学用Oracle系列(5)&#xff1a;三大数据类型》一文中详细地讲述了 Oracle 的基本数据类型&#xff0c;文中还提到&#xff0c;除基本数据类型之外&#xff0c;Oracle 还在语法上支持一些非固有数值类型。 事实上&#xff0c;Oracle 在语法上支持的数据类…

kindle图书免费下载_如何在Kindle上免费签出图书馆书籍

kindle图书免费下载Tired of paying so much for ebooks? Most libraries these days let you check out eBooks, for free, just like regular books. 厌倦了为电子书支付这么多钱&#xff1f; 如今&#xff0c;大多数图书馆都让您免费阅读电子书&#xff0c;就像普通书籍一样…

第五章 了解你的用户

第五章 了解你的用户逻辑人的争议&#xff1a;要学会把软件开发简单易用象牙塔式的开发&#xff1a;开发团队常年闭封在“高塔”之中&#xff0c;一门心思的做着魔法一般的软件。这些开发者根本就不知道用户会怎么样的使用他们所做的软件。我们应该避免这种象牙塔式的开发&…

总结之:CentOS 6.4系统裁减详解及装载网卡步骤

前言 随着接触Linux的慢慢深入、对Linux也有了一个基本认识了吧&#xff0c;慢慢的接触系统内核、系统配置文件、在了解Linux的系统启动流程后&#xff0c;现在来总结一下一个简单的Linux系统的裁减方法和步骤&#xff0c;一个只有内核文件和几个简单的命令的小Linux系统&am…

android 设备占用_如何查看正在占用Android设备的空间

android 设备占用When you picked up your shiny new Android device, you probably thought “yeah, this has plenty of storage. I’ll never fill it up!” But here you are, some number of months later with a full phone and no clue why. No worries: here’s how yo…

最近沉迷生意经

高度战略抢占顾客心智 速度战略 . 规模不够就谈发展速度&#xff0c;避开自己的劣势&#xff1b; . 发展速度快说明产品好&#xff0c;受欢迎度高; 钱是工具&#xff0c;从钱上解脱 . 不能被钱所困 . 放下钱&#xff0c;才能潇洒地使用钱 第一时间抢占顾客心智 . 核心点就是抢占…

mysql密码正确却提示错误, 不输入密码反而能登录

今天部署阿里云服务器, 发现之前可以连接的mysql服务器突然连接不上了, 密码我确认是正确的,但登录时就是显示密码错误, 很崩溃, 差点气得我就想重装mysql了。 好在经过几番苦寻找到了以下能解决我问题的资料&#xff0c; 成功解决了我的问题&#xff0c; 万分感谢&#xff0c;…

域用户权限|安装软件

如何让普通的域用户有安装软件的权限&#xff1f;现在给客户部署了活动目录&#xff0c;客户要求 普通的域用户也可以自己安装软件。不知道如何设置&#xff0c;希望大家帮帮忙&#xff01;我告诉客户的做法如下&#xff1a;不知道可行性如何&#xff1f; 1、在域中新建一个域账…

c/c++ new delete初探

new delete初探 1&#xff0c;new有2个作用 开辟内存空间。调用构造函数。2&#xff0c;delete也有2个作用 释放内存空间调用析构函数。如果用new开辟一个类的对象的数组&#xff0c;这个类里必须有默认(没有参数的构造函数&#xff0c;或者有默认值的参数的构造函数)的构造函数…