题目描述
师兄猜你看的第一道题是这道哈哈哈。没错,师兄给你送福利了,这道题你只需要呆萌呆萌的把下面的代码交上去就行了,师兄是好人【坏笑】。
include<stdio.h>
include<string.h>
char ch[100000+5];
int main()
{
int t; scanf("%d",&t); while(t--) { int len,ans=0; scanf("%s",ch); len=strlen(ch); for(int i=0;i<len;i++) for(int j=i+1;j<len;j++) for(int k=j+1;k<len;k++) if(ch[i]=='Z'&&ch[j]=='Q'&&ch[k]=='U') ans++; printf("%d\n",ans); } return 0;
}
输入描述:
第一行一个整数t代表有t组测试用例,0≤t≤100。
接下来t行,输入一个仅包含'Z','Q'和'U'三种字符的字符串s。( 0<|s|≤100000,|s|为字符串s的长度)
输出描述:
每行一个整数表示代码中ans的值。
示例1
输入:
2
ZQUZQU
ZQUZQUZQU
输出:
4
10
备注:
TLE了吧【奸笑】,师兄太坏了,不行,这样不好。这道主要锻炼你快速读懂别人代码的能力,好好理解这段代码,想想怎么优化吧。
题意解析:
首先理解题目的意思:第一行输入待测数据的个数n,接下来就是n行的待测数据,每组待测数据都是一个只有'Z','Q','U'三个字符组成的字符串,并统计字符串"ZQU"的个数(中间可以忽略若干个字符)。
如示例1:字符从1~6来表示,总共有123,126,156,456四组"ZQU"。
解法:
这题卡的是算法的时间,所以想用暴力的方式++过去肯定是行不通的,那样的时间复杂度是n的3次方。
通过对要检测的字符串进行分析,以Q为中心分成Z跟U两个部分,所以对于每一个Q的"ZQU"个数都是这个Q左边Z的个数*右边U的个数。
如此一来,时间复杂度就是两次遍历,也就是2n。
include <iostream
using namespace std;
struct qq{
int zz, uu;
};
int main(){
int n;
cin>>n;
while(n--){
string s;
cin>>s;
qq q[s.size()];
int zn=0, qn=0, un=0;
for(int i=0; i<s.size(); i++)
{
if(s[i]=='Z')
zn++;
if(s[i]=='Q'){
q[qn].zz=zn;
qn++;
}
}
int t=qn-1;
for(int i=s.size()-1; i>=0; i--){
if(s[i]=='U')
un++;
if(s[i]=='Q'){
q[t].uu=un;
t--;
}
if(t<0) break;
}
long sum=0;
for(int i=0; i<qn; i++)
sum+=q[i].zz*q[i].uu;
cout<<sum<<endl;
}
}