码迷,mamicode.com
首页 > 其他好文 > 详细

Seek the Name, Seek the Fame

时间:2020-07-26 01:15:34      阅读:49      评论:0      收藏:0      [点我收藏+]

标签:lin   ase   int   names   using   base   输出   while   cin   

题目描述

原题来自:POJ 2752

给定若干字符串(这些字符串总长 \(\leq 4 \times 10^5\)),在每个字符串中求出所有既是前缀又是后缀的子串长度。

例如:ababcababababcabab,既是前缀又是后缀的:abababababcababababcababababcabab

输入格式

输入若干行,每行一个字符串。

输出格式

对于每个字符串,输出一行,包含若干个递增的整数,表示所有既是前缀又是后缀的子串长度。

样例

样例输入

ababcababababcabab
aaaaa

样例输出

2 4 9 18
1 2 3 4 5

code

#include <bits/stdc++.h>
using namespace std;
const int maxn=4e5+100;
const int base=233;
char s[maxn];
int poww[maxn],hash[maxn];
int main(){
	while(cin>>s+1){
		int len=strlen(s+1);
		poww[1]=233;
		for(int i=2;i<=len;i++)
			poww[i]=poww[i-1]*base;
		hash[1]=s[1];
		for(int i=2;i<=len;i++)
			hash[i]=hash[i-1]*base+s[i];
		for(int i=1,j;i<=len;i++){
			j=len-i+1;
			if(hash[i]-hash[0]*poww[i] == hash[len]-hash[j-1]*poww[i])
				cout<<i<<" ";
		}
		cout<<endl;
	}
}

Seek the Name, Seek the Fame

标签:lin   ase   int   names   using   base   输出   while   cin   

原文地址:https://www.cnblogs.com/hellohhy/p/13378121.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!