【题意】:

给出s串出来,能否找到一个前缀 ,通过多次前缀进行拼接。构成s串。如果有多个,请输出最多次数那个。

如:aaaa

可以用1个a,进行4次拼接

可以用2个a,进行2次拼接

可以用4个a,进行1次拼接


提供两种做法:

第一种是:利用kmp算法中求解  longest prefix table的方法,

找到最后一个位置的上的 p[len-1],如果用总长度减去(len-p[len-1])能否通过这一个前缀来拼接出来。

就是判断是否能整除。

 #include<bits/stdc++.h>
using namespace std;
const int N = 1e6 + ;
char str[N];
int p[N],len;
void get_next(char s[]){
len = strlen( s );
int i = , j = ;
p[] = ;
while( i < len ){
if( s[i] == s[j] ){
p[i++] = ++j ;
}else{
if( j > ){
j = p[j-] ;
}else{
p[i] = j ;
i++ ;
}
}
}
}
int main()
{
while( cin >> str ){
if( str[] == '.' ) break;
get_next( str );
int len = strlen( str );
printf("%d\n",len % (len-p[len-]) == ?
len / (len-p[len-]) : );
}
return ;
}

另一种方法就是:

用双hash来实现,双hash处理前缀和,最后用for循环,枚举所有的因数进行处理。

 #include<bits/stdc++.h>
#define Mp make_pair
#define F first
#define S second
using namespace std;
const int N = 1e6+;
const int M1 = 1e9+ , M2 = 1e9+;
typedef long long ll;
typedef struct Node{
long long first ,second;
Node (){}
Node ( ll u,ll v){ first = u , second = v ;}
}PII;
//typedef pair<ll,ll> PII; const PII base{M2,M1},p{M1,M2},One{1ll,1ll},Zero{0ll,0ll}; PII operator - (PII u,PII v){
return Node( (u.first-v.first+p.first)%p.first ,(u.second-v.second+p.second)%p.second );
}
PII operator * ( PII u , PII v ){
return Node( (u.first*v.first)%p.first , (u.second*v.second)%p.second );
}
PII operator + ( PII u , PII v ){
return Node( (u.first+v.first)%p.first , (u.second+v.second)%p.second );
}
PII operator + ( PII u , int v ){
return Node( (u.first+v)%p.first , (u.second+v)%p.second );
}
bool operator != ( PII u,PII v ){
return !( u.first == v.first && u.second == v.second );
}
PII Pow( PII a ,int b){
PII ans = One ;
while( b ){
if( b& )
ans = ans * a ;
b >>= ;
a = a * a ;
}
return ans ;
}
PII sum[N];
char str[N];
int main()
{
ios_base :: sync_with_stdio();
cin.tie(NULL),cout.tie(NULL); while( cin >> str+ ){
if( str[] == '.') break;
int len = strlen(str+); sum[] = Zero ;
for(int i=;i<=len;i++)
sum[i] = sum[i-] * base + str[i];
int ans = ;
for(int i=;i<=len/;i++){
if( len % i ) continue ;
bool flag = false ;
for(int j=i ; !flag && j<=len; j+=i ){
if( sum[j] - sum[j-i] * Pow(base,i) != sum[i] ){
flag = true ;
}
}
if( !flag ) {
ans = len/i ;
break;
}
}
cout << ans << endl ;
}
return ;
}

BKDR

最新文章

  1. 通过xshell远程连接ubuntu
  2. 清除文件夹下的SVN信息
  3. 关于URI URL URN
  4. Membership基本用法
  5. 图数据库(graph database)资料收集和解析 - daily
  6. jqyery dataTable 基本用法
  7. 模拟 POJ 1573 Robot Motion
  8. CF 13E Holes 【块状链表】
  9. nvarchar and nchar
  10. Knockout获取数组元素索引的2种方法,在MVC中实现
  11. SharePoint 2016 配置用户请求应用程序
  12. node.js 发送http 请求
  13. webmagic学习-使用注解编写爬虫
  14. python之celery的使用(一)
  15. python+opencv 运行环境搭建
  16. Android Studio 运行shell
  17. spring 在ssh三大框架中充当的角色
  18. 11.16 Daily Scrum
  19. linu中解压不同后缀的文件
  20. ThinkPHP中I(&#39;post.&#39;)与create()方法的对比

热门文章

  1. Mininet系列实验(七):Mininet脚本实现控制交换机行为
  2. lnmp一键安装包 多PHP版本使用教程
  3. SSM项目启动报错WEB-INF\lib\javax.servlet-api-4.0.1.jar) - jar not loaded. See Servlet Spec 3.0, section 10
  4. Java TreeSet,Collections使用
  5. 微信小程序网络通信(一)
  6. Socket: Java Socket 几个重要的TCP/IP选项解析(转)
  7. CentOS上安装GlassFish4.0
  8. ActiveMQ之三--JMS-Spring和ActiveMQ整合的完整实
  9. 使用SoapUI发送Post请求
  10. VPB测试 使用Osgdem运行例子