ACM问题 我的代码怎么老超时呢?? http://codeforces.com/contest/50/problem/B

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ACM问题 我的代码怎么老超时呢?? http://codeforces.com/contest/50/problem/B相关的知识,希望对你有一定的参考价值。

http://codeforces.com/contest/50/problem/B
B. Choosing Symbol Pairs
time limit per test: 2 seconds
memory limit per test: 256 megabytes
input: standard input
output: standard output
There is a given string S consisting of N symbols. Your task is to find the number of ordered pairs of integers i and j such that

1. 1 ≤ i, j ≤ N

2. S[i] = S[j], that is the i-th symbol of string S is equal to the j-th.

Input
The single input line contains S, consisting of lowercase Latin letters and digits. It is guaranteed that string S in not empty and its length does not exceed 105.

Output
Print a single number which represents the number of pairs i and j with the needed property. Pairs (x, y) and (y, x) should be considered different, i.e. the ordered pairs count.

Sample test(s)
Input
great10Output
7Input
aaaaaaaaaaOutput
100
我的代码:
#include<stdio.h>
#include<string.h>
int main()

char s[50001];
int i,h;
__int64 sum=0;
int a[36];
while(gets(s))

sum=0;
memset(a,0,sizeof(a));
for(i=0;s[i];i++)

if(s[i]>='a'&&s[i]<='z')
a[s[i]-'a'+10]++;
else
a[s[i]-'0']++;

h=strlen(s);
for(i=0;i<36;i++)

if(a[i]!=0)
sum+=(a[i]*(a[i]-1));

printf("%I64d\n",sum+h);

return 0;

你的算法需要优化。其实不需要去找出每对匹配的i j,只要找出数量就可以了。我给段简单的代码,你看看应该就明白了。

#include <stdio.h>

double table[256];
char str[100001];

void main()

char *p = str;
int i;
double n=0;
gets(str);
while(*p)
table[*(p++)]+=1;
for (int i = 1; i < 256; i++)
n += table[i]*table[i];
printf("%.0lf", n);
参考技术A 区间最值RMQ
ST算法或者线段树
提供一个ST代码
/*
Range Minimum Query
Sparse Table (ST) algorithm
*/
#include<cstdio>
#include<cmath>
#define min(x,y) (x)<(y)?(x):(y)
//#define max(x,y) (x)>(y)?(x):(y)
#define N 100005
int n,s[N],dp[N][25],MAX[N][25],MIN[N][25];
void slove()//psotion

int i,j;
for(i=0;i<n;i++)
dp[i][0]=i;
for(j=1;1<<j<=n;j++)
for(i=0;i+(1<<j)-1<n;i++)
if(s[dp[i][j-1]]>s[dp[i+(1<<(j-1))][j-1]])
dp[i][j]=dp[i][j-1];
else
dp[i][j]=dp[i+(1<<(j-1))][j-1];

int find(int i,int j)

int k=int(log(j-i+1)/log(2));
if(s[dp[i][k]]>=s[dp[j-(1<<k)+1][k]])
return dp[i][k];
return dp[j-(1<<k)+1][k];

void ST()//value

int i,j;
for(i=0;i<n;i++)
MIN[i][0]=MAX[i][0]=s[i];
for(j=1;1<<j<=n;j++)
for(i=0;i+(1<<j)-1<n;i++)

MIN[i][j]=min(MIN[i][j-1],MIN[i+(1<<(j-1))][j-1]);
MAX[i][j]=max(MAX[i][j-1],MAX[i+(1<<(j-1))][j-1]);


int RMQ(int i,int j)

int a,b,k=int(log(j-i+1.)/log(2.));
a=max(MAX[i][k],MAX[j-(1<<k)+1][k]);//max
b=min(MIN[i][k],MIN[j-(1<<k)+1][k]);//min
return a;

int main()

int q,i,a,b;
while(scanf("%d",&n),n)

for(i=1;i<=n;i++)
printf("%d ",i);puts("");
for(i=0;i<n;i++)

scanf("%d",s+i);

slove();
ST();
scanf("%d",&q);
while(q--)

scanf("%d%d",&a,&b);
printf("pos:%d max:%d\n",find(a-1,b-1)+1,s[find(a-1,b-1)]);
printf("max:%d\n",RMQ(a-1,b-1));


如何判断一个程序是不是超时??

象我要写一个代码 代码执行的时间限制不能超过1秒,那我应该符合来判断我写的代码有没超时呢?象代码执行时间限时1秒我写这样一个代码:#include<stdio.h>int main() int i,j; __int64 a;for(i=0;i<1000000) for(j=0;j<1000000;j++) printf("***");printf("\n");return 0; 那这代码执行完要多少时间呢,是否会超过1秒呢?(我只举个列子,在没写出代码时, 在我想怎么写代码时,如果我打算这么写,我应该如何来判断我如果这样写代码,代码会不会超时呢???)

参考技术A 有一个函数,叫GetTickCount,获取程序运行的时间 如果你想连续输出"***"一秒中,就可以这么写: #include <windows.h>#include <stdio.h> int main()unsigned int uiStartTime=GetTickCount();//获取当前程序运行毫秒数while(GetTickCount() - uiStartTime < 1000)//判断此时程序运行毫秒数,减开始时的毫秒数,1秒内的话就输出 printf("***"); printf("\n");//1秒过后return 0;

以上是关于ACM问题 我的代码怎么老超时呢?? http://codeforces.com/contest/50/problem/B的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的SQL SERVER2005在连接ODBC时会出现连接超时过期呢

ACM题目如何避免超时?有啥技巧吗?

如何判断一个程序是不是超时??

uniapp post请求万条数据就超时,那百万条数据怎么处理呢?

谷歌,***等未使用超时的保持活动http标头?

Ruby Net::HTTP 超时