bzoj2320: 最多重复子串

news/2024/11/24 6:25:11/

2320: 最多重复子串

Time Limit: 40 Sec  Memory Limit: 128 MB
Submit: 246  Solved: 66
[Submit][Status][Discuss]

Description

一个字符串P的重复数定义为最大的整数R,使得P可以分为R段连续且相同的子串。比方说,“ababab”的重复数为3,“ababa”的重复数为1。

Your Task

对于给定的串S,找出S的一个子串K使得K的重复数最大。

 

Input

第一行T表示数据组数

对于每组数据,一行中一个仅包含小写字母的字符串S

 

Output

对于每组数据,在一行中输出K,如果有多个解,输出字典序最小的那一个

 

Sample Input

2
ccabababc
daabbccaa

Sample Output


ababab
aa

HINT

 

100%:T≤10,S的长度不超过100000

 

题解

……我就来贴个代码吧……orz下claris……

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 typedef unsigned long long ll;
 5 const int N=100010,base=127;
 6 int ans,k,st,ed,n,m,time,i,l;char s[N];ll f[N],pow[N];
 7 using namespace std;
 8 ll hash(int l,int r){return f[r]-f[l-1]*pow[r-l+1];}
 9 int lcs(int x,int y)
10 {
11     int l=0,r=min(x,y);
12     while(l<r){
13         int mid=(l+r)/2;
14         if(hash(x-mid,x)==hash(y-mid,y))l=mid+1;else r=mid;
15     }
16     return l;
17 }
18 int lcp(int x,int y)
19 {
20     int l=0,r=min(n-x+1,n-y+1);
21     while(l<r){
22         int mid=(l+r)/2;
23         int a=hash(x,x+mid);
24         int b=hash(y,y+mid);
25         if(hash(x,x+mid)==hash(y,y+mid))l=mid+1;else r=mid;
26     }
27     return l;
28 }
29 void up(int x,int y)
30 {
31     if(k>ans){ans=k;st=x;ed=y;return;}
32     int l0=ed-st+1,l1=y-x+1,t=lcp(x,st);
33     if(t==min(l0,l1)){
34         if(t==l0)return;
35         st=x;ed=y;return;
36     }
37     if(s[st+t]>s[x+t]){st=x;ed=y;}
38 }
39 int main()
40 {
41     scanf("%d",&time);
42     for(i=1,pow[0]=1;i<=N;i++)pow[i]=pow[i-1]*base;
43     while(time--)
44     {
45         scanf("%s",s+1);n=strlen(s+1);
46         for(ans=st=ed=i=1;i<=n;i++)
47             if(s[i]<s[st])st=ed=i;
48         for(f[0]=0,i=1;i<=n;i++)f[i]=f[i-1]*base+s[i];
49         for(int i=1;i<=n/2;i++)
50             for(int j=1;j<=n;j+=i){
51                 int x=j+i;if(x>n)break;
52                 if(s[j]!=s[x])continue;
53                 int a=lcp(j,x),b=lcs(j,x);
54                 k=(a+b-1)/i+1;
55                 l=k*i;
56                 if(k>=ans)for(int y=j-b+1;y<=i+j+a-l;y++)up(y,y+l-1);
57             }
58         for(int i=st;i<=ed;i++)putchar(s[i]);puts("");
59     }
60     return 0;
61 }
View Code

 

转载于:https://www.cnblogs.com/oldjang/p/6514007.html


http://www.ppmy.cn/news/139330.html

相关文章

OX 【HRBUST - 2320】

题目链接 HRBUST 2320 Kim喜欢玩井字棋。但是他从来都没有赢过&#xff1a;&#xff09;Kim非常好奇井字棋是否有一个必胜的策略。 给定一个局面&#xff0c;以及下一步该谁走&#xff08;o或x&#xff09;&#xff0c;请判断在双方都足够聪明的情况下&#xff08;双方一直采用…

Stm32F103 Hal库硬件iic 访问AM2320温湿度传感器

Stm32F103 Hal库硬件iic 访问AM2320温湿度传感器 管脚配置 PB6 PB7 之前用库函数&#xff0c;一直读不到&#xff0c;换hal库后正常了&#xff0c;因为要在android板上调试&#xff0c;但是板卡没来&#xff0c;只好用stm32 先调试下。 很简单&#xff0c;先初始化i2C1 i2c.c …

洛谷 2320

解题思路&#xff1a; 首先所有的钱袋都可以看成一个取或不取的情况。那么这些钱袋取或不取就可以看作0或1&#xff0c;也就是说&#xff0c;要使用一些数字表示一个范围里的所有数&#xff0c;同时这又很二进制&#xff08;取或不取&#xff09;。所以我们就把钱袋里钱的数量定…

AM2320 温湿度计 单总线读取数据

温湿度计 用单总线方式读取数据 AM2320支持IIC通信和单总线通信&#xff0c;这里只用单总线&#xff1a; 使用单总线时的接线方式时&#xff0c;只需接第二引脚SDA&#xff0c;SCL接地就行。 通信时序图&#xff1a; 由时序可见通信非常简单&#xff0c;关键点要把握好每个时序…

ESP8266-Arduino编程实例-AM2320温度湿度传感器驱动

AM2320温度湿度传感器驱动 1、AM2320介绍 温湿度复合传感器 AM2320数字温湿度传感器是一个经过校准的数字信号输出。 采用特殊的温湿度采集技术,确保产品具有极高的可靠性和优异的长期稳定性。 传感器由一个电容式湿度元件和一个集成的高精度温度测量装置组成,并与一个高性…

AM2320 linux驱动程序

AM2320 linux驱动程序 采集&#xff0c;上报input 子系统 #include <linux/init.h> #include <linux/kernel.h> #include <linux/module.h> #include <linux/workqueue.h>#include <linux/platform_device.h> #include <linux/gpio.h> #…

慧荣SM2320是什么主控?一文便知固态主控SM2320+固件下载

在移动SSD还没有兴起的时期&#xff0c;U盘被看做是传输数据非常好的载体。它身材小巧&#xff0c;性能不俗&#xff0c;偶然的不小心跌落也不会损坏数据。 不过随着固态硬盘的兴起&#xff0c;现在的移动硬盘也是以NAND存储介质为主流了&#xff0c;意味着它的体积可以进一步…