【UVa】10298 - Power Strings

23 篇文章 0 订阅

Problem here


Given two strings a and b we define a ∗ b to be their concatenation. For
example, if a = ‘abc’ and b = ‘def’ then a ∗ b = ‘abcdef’. If we think of
concatenation as multiplication, exponentiation by a non-negative integer
is defined in the normal way: a
0 = ‘’ (the empty string) and a
(n+1) =
a ∗ (a
n).

Input

Each test case is a line of input representing s, a string of printable characters.
The length of s will be at least 1 and will not exceed 1 million
characters. A line containing a period follows the last test case.

Output

For each s you should print the largest n such that s = a
n for some string
a.

Sample Input

abcd
aaaa
ababab
.

Sample Output

1
4
3

Solution

#include <iostream>
#include <string>
//#include <fstream>
#define MAX_NUM 9999999
using namespace std;

//ifstream fin("10298.in");
//ofstream fout("10298.out");

int next_pos[1000001];

void getNext(string str){
    next_pos[0] = -1;
    int j = 0, k = -1;
    while(j < str.size()){
        if(k == -1 || str[j] == str[k]){
            next_pos[++j] = ++k;
        }
        else{
            k = next_pos[k];
        }
    }
}

int main(){
    string input;
    while(cin >> input){
        if(input == ".")
            break;

        getNext(input);
        int length = input.size();
        if(length % (length- next_pos[length]) == 0 && next_pos[length] != 0)
            cout << length / (length - next_pos[length]) << endl;
        else
            cout << 1 << endl;
    }

    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值