列表

详情


NC50322. Power Strings

描述

给定若干个长度的字符串,询问每个字符串最多是由多少个相同的子字符串重复连接而成的。如:ababab则最多有3个ab连接而成。

输入描述

输入若干行,每行有一个字符串。特别的,字符串可能为.即一个半角句号,此时输入结束。

输出描述

输出每个字符串最多是由多少个相同的子字符串重复连接而成的

示例1

输入:

abcd
aaaa
ababab
.

输出:

1
4
3

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 383ms, 内存消耗: 5492K, 提交时间: 2019-12-08 20:44:49

#include <bits/stdc++.h>
using namespace std;

int main() {
  string S;
  while (cin >> S && S != ".") {
    S.push_back('#');
    int N = S.size();
    vector<int> next(N, -1);
    for (int i = 1; i < N; i++) {
      int j = next[i-1];
      while (j != -1 && S[i - 1] != S[j]) j = next[j];
      next[i] = j + 1;
    }
    int t = next[N-1];
    while (t != -1 && (N-1)%(N-1-t)) t = next[t];
    cout << (N-1) / (N-1-t) << endl;
  }
}

C++(g++ 7.5.0) 解法, 执行用时: 140ms, 内存消耗: 5232K, 提交时间: 2023-05-19 21:54:41

#include <bits/stdc++.h>
using namespace std ;
const int N=1e6+1;
char a[N];
int n,b[N];

void init()
{
    int i,j=0;

    for(i=1; i<n; i++)
    {
        while(j>0&&a[i+1]!=a[j+1]) j=b[j];
        if(a[i+1]==a[j+1]) j++;

        b[i+1]=j;
    }
}
int main()
{
    while(cin>>a+1,a[1]!='.')
    {
        n=strlen(a+1);
        init();
        if(n%(n-b[n])) cout<<1<<endl;
        else  cout<<n/(n-b[n])<<endl;
    }
}

C++11(clang++ 3.9) 解法, 执行用时: 264ms, 内存消耗: 5588K, 提交时间: 2020-03-05 13:16:08

#include<bits/stdc++.h>
using namespace std;
int main()
{
	string S;
	while(cin>>S&&S!=".")
	{
		S.push_back('#');
		int N=S.size();
		vector<int> next(N,-1);
		for(int i=1;i<N;i++)
		{
			int j=next[i-1];
			while(j!=-1&&S[i-1]!=S[j]) j=next[j];
			next[i]=j+1;
		}
		int t=next[N-1];
		while(t!=-1&&(N-1)%(N-1-t)) t=next[t];
		cout<<(N-1)/(N-1-t)<<endl;
	}
}

上一题