NC50313. Power Strings
描述
输入描述
输入若干行,每行有一个字符串。特别的,字符串可能为.即一个半角句号,此时输入结束。
输出描述
输出每个字符串最多是由多少个相同的子字符串重复连接而成的
示例1
输入:
abcd aaaa ababab .
输出:
1 4 3
C++(g++ 7.5.0) 解法, 执行用时: 115ms, 内存消耗: 5272K, 提交时间: 2022-09-24 10:08:36
#include <iostream> #include <cstring> using namespace std; const int N=1e6+10; int ne[N]; char c[N]; int main () { std::string a; while(std::cin>>c+1) { if(c[1]=='.'&&strlen(c+1))break; for(int i=2,j=0;c[i];i++) { while(j&&c[i]!=c[j+1])j=ne[j]; if(c[j+1]==c[i])j++; ne[i]=j; } int cnt=0; int j=std::strlen(c+1); cnt=j/(j-ne[j]); if(j%(j-ne[j]))cnt=1; cout<<cnt<<endl; } }
C++11(clang++ 3.9) 解法, 执行用时: 61ms, 内存消耗: 12128K, 提交时间: 2019-08-14 23:07:15
#include<bits/stdc++.h> using namespace std; char a[1000005]; int p[1000005],n; void pre() { p[1]=0; int j=0; for(int i=1;i<n;i++) { while(j>0&&a[j+1]!=a[i+1])j=p[j]; if(a[j+1]==a[i+1])j++; p[i+1]=j; } } int main() { for(;;) { scanf("%s",a+1); if(a[1]=='.')break; n=strlen(a+1); pre(); if(n%(n-p[n])==0)printf("%d\n",n/(n-p[n])); else printf("1\n"); } return 0; }