(原创不成功去参考)PTA乙级1040 有几个PAT

当时真的想了很久,第一遍代码是纯暴力解决,做之前我就知道肯定不行,运行绝对超时,没办法,这代码写起来看上去简单,哈哈哈哈
第二遍,想了想用逐步标记不同字母位置,算出其倍数来叠加次数。结果还是运算超时,因为还是存在双循环,还是没想出
第三遍,没办法,看网上各位有经验的博主贴出的代码,主流有两种,当时看到我几乎撞墙,觉得白学了一样
其实你我都知道这是数学问题,但我又不知道具体是什么数学问题,不然都想去搜索相关材料好好进修一下
最后贴出我的第二遍的代码,实在惭愧。

1040 有几个PAT (25 分)
字符串 APPAPT 中包含了两个单词 PAT,其中第一个 PAT 是第 2 位(P),第 4 位(A),第 6 位(T);第二个 PAT 是第 3 位(P),第 4 位(A),第 6 位(T)。
现给定字符串,问一共可以形成多少个 PAT?
输入格式: 输入只有一行,包含一个字符串,长度不超过10的​5次方 ,只包含 P、A、T 三种字母。
输出格式:在一行中输出给定字符串中包含多少个 PAT。由于结果可能比较大,只输出对 1000000007 取余数的结果。
输入样例:
APPAPT
输出样例:
2

正确代码:自己再在根据理解情况下写一次

#include 
#define LIM 1000000007
int main()
{
    unsigned int Pcount=0,Acount=0,Tcount=0,i=0,aPos=0,PATcount=0;
    char c,str[100001];
    //1.先处理好输入 
    while((c = getchar()) != '\n')
    {
        if(c=='A')
            Acount++;
        else if(c=='T')
            Tcount++;
        str[i++] = c;
    }
    str[i]='\n';
    
    //2.计算过程,用了一种能理解方法,以A为中心,算出前后PT的次数累加
    i=0;
    while(str[i]!='\n'&&aPos

另外一个主流的解法,这是个看着似懂非懂的代码,我觉得最神就是这个代码,但还是理解不了,在输入过程中已经计算好了,神!!

#include 
#define LIM 1000000007
int main()
{
    unsigned int P = 0, PA = 0, PAT = 0;
    char c;
    while((c = getchar()) != '\n')
    {
        if(c == 'P')   P++;
        if(c == 'A')   PA = (PA + P) % LIM;
        if(c == 'T')   PAT = (PAT + PA) % LIM;
    }
    printf("%d", PAT);
    return 0;
}

第二遍的代码:(一开始我是以PPPAAATTT为蓝图),后来才发觉忽略了一种情况,P位置不变,A与T相对变化的个数,再加上这种情况时候已经是多重循环。

#include 
int main()
{   
    int positP=0,positA=0,positT=0,lengthP,lengthA,lengthT;
    int PosP[100001],PosA[100001],PosT[100001];
    int count=0,i=0,j=0,k=0,isTerminal=0;
    char c;
    while((c=getchar())!=EOF&&c!=' '&&c!='\n')
    {
        if(c=='P')
            PosP[positP++] = i;
        else if(c=='A')
            PosA[positA++] = i;
        else if(c=='T')
            PosT[positT++] = i;
        i++;
    }
    lengthP=positP;
    lengthA=positA;
    lengthT=positT;
    
    i=j=k=0;
    
    while(iPosA[j]&&jPosT[k]&&kPosT[k]&&k

你可能感兴趣的:((原创不成功去参考)PTA乙级1040 有几个PAT)