FZU Problem 2137 奇异字符串

点击打开链接

题意:给定一个长度为n的字符串,要求这个字符串的所有子串的价值总和

思路:题意的奇异串是AxA,就是x旁边两个串是要一样的,不是相反的。注意x不能在A中出现,根据这个,A的范围只可能在x与上一个字母x之间,可以直接枚举。那么我们可以枚举这个字符串的每一个字母为x,然后往两边扩展去判断。判断的过程利用hash,注意hash函数的使用。使用unsigned long long,这样爆了unsigned long long后就相等于取模

代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;

typedef  unsigned long long int64;
const int MAXN = 100010;

char str[MAXN];
int64 hash[MAXN];
int64 base[MAXN];

void initHash(){
    int len = strlen(str+1);
	int seed = 131;
	hash[0] = 0;
	for(int i = 1 ; i <= len ; i++)
		hash[i] = hash[i-1]*seed+str[i];
	base[0] = 1;
	for(int i = 1 ; i <= len ; i++)
		base[i] = base[i-1]*seed;
}

int64 getHash(int l , int r){
	return hash[r]-hash[l-1]*base[r-l+1];
}

int64 solve(){
	int len = strlen(str+1);
    initHash();
	int64 ans = 0;
	for(int i = 2 ; i < len ; i++){
		int left = i-1;
		int right = i+1;
		while(left >= 1 && right <= len){
			if(str[left] == str[i] || str[right] == str[i])
				break;
			if(getHash(left,i-1) == getHash(i+1,right))
				ans += (int64)((i-left)*2+1)*((i-left)*2+1);
			left--;
			right++;
		}
	}
	return ans;
}

int main(){
    int cas;
    scanf("%d" , &cas);
	while(cas--){
		scanf("%s" , str+1);
	    cout<<solve()<<endl;
	}
	return 0;
}
时间: 2024-10-01 06:08:31

FZU Problem 2137 奇异字符串的相关文章

FZU Problem 2132 LQX的作业

点击打开链接 题意:题目要求选择n个0-1之间的数拍完序之后第m个小于等于x的概率 思路:1~0直接选择一个数小于等于x的概率为x,那么选择i个数都小于等于x的概率为x^i.因此,要求第m个数小于等于x,我们可以知道m-n的数也有可能小于等于x,只要枚举m-n求和即可 代码: #include<cmath> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm&

FZU 1692 Key problem

点击打开FZU 1692 思路: 构造矩阵+矩阵快速幂 分析: 1 题目的意思是有n个人构成一个圈,每个人初始的有ai个苹果,现在做m次的游戏,每一次游戏过后第i个人能够增加R*A(i+n-1)%n+L*A(i+1)%n 个苹果(题目有错),问m轮游戏过后每个人的苹果数 2 根据题目的意思我们能够列出一轮过后每个人的苹果数    a0 = a0+R*an-1+L*a1    a1 = a1+R*a0+L*a2    .............................    an-1 =

ZOJ Problem Set - 3713

题意:给定一个字符串,用字符串ASC2码16进制数输出 ,并在前面输出字符串长度的16进制,输出长度的规则是 先输出长度的二进制数的后七位的十六进制(如果左边还有1 则这在后七位前面加上个1再输出  然后二进制数右移动七位,直到左边没有1)   注:所有16数都必须为两位! 解题思路:对长度进行输出处理 解题代码: #include<stdio.h> #include<string.h> #include<stdlib.h> #include<time.h>

ADO连接数据库字符串大全(VP,Excel,文本,Sybase,.NET等)

ado|excel|连接数据库|字符串 ADO连接数据库字符串大全(VP,Excel,文本,Sybase,.NET等) This page contains sample ADO connection strings for ODBC DSN / DSN-Less,OLE DB Providers, Remote Data Services (RDS), MS Remote, MS DataShape. Also included are ADO.NET connection strings f

ADO连接数据库字符串大全

ado|连接数据库|字符串 ADO连接数据库字符串大全 This page contains sample ADO connection strings for ODBC DSN / DSN-Less, OLE DB Providers, Remote Data Services (RDS), MS Remote, MS DataShape. Also included are ADO.NET connection strings for each .NET Managed Provider (

String to Integer:字符串转成整形

[ 问题: ] Hint:Carefully consider all possible input cases. If you want a challenge, please do not see below and ask yourself what are the possible input cases. Notes:It is intended for this problem to be specified vaguely (ie, no given input specs). Y

UVa 642 Word Amalgamation:查字典&amp;amp;字符串排序

642 - Word Amalgamation Time limit: 3.000 seconds http://uva.onlinejudge.org/index.php?option=onlinejudge&page=show_problem&problem=583 In millions of newspapers across the United States there is a word game called Jumble. The object of this game

算法:uva 1351 String Compression(字符串区间dp)

题目大意 给一个字符串,可以把连续相同的部分进行缩写成k(S)的形式,S是一个字符串,k表示 有连续相同的S 例如,abgogogogo,可以缩写成ab4(go). 还可以嵌套缩写,比如 "nowletsgogogoletsgogogo", 缩写成"now2(lets3(go))" 思路 一道区间dp,但是这题并 不好想 f(i, j)表示字符串的i~j位的最小位数 那么 f(i, j) = min{  min{ f(i,k)+f(k+1, j), i<=k&

PHP常用字符串操作函数实例总结(trim、nl2br、addcslashes、uudecode、md5等)_php技巧

本文实例总结了PHP常用字符串操作函数.分享给大家供大家参考,具体如下: /*常用的字符串输出函数 * * echo() 输出字符串 * print() 输出一个或多个字符串 * die() 输出一条信息,并退出当前脚本 * printf() 输出格式化字符串 * sprintf() 把格式化的字符串写入到一个变量中 * */ //ucfirst //将字符串中的首字母转换为大写 $str="string"; echo ucfirst($str); echo "<hr&