1. 程式人生 > >POJ 1961

POJ 1961

.。。雖然 POJ 還沒好。。但是我感覺這個程式碼能A。。。如果有錯誤。。我再改

題目大概:

        給一個長度為 n 的字串, 問題是輸出 第 i 個字母字首。。重複出現了幾次(一言難盡。。舉例吧)

例如樣例中   12  aabaabaabaab

先輸出的 2 2 代表 第二個字母 a 出現了兩次了 因為 第一個是 a 第二個還是 a 這就是一個小的迴圈節

之後的 6 2 代表 到第六位時候  aab 這個組合出現過 2 次了。。

而  9 3 代表 aab 出現 3次

12 4 。。就不用說了吧。。

總而言之,就是求並輸出字元裡所有 0--i 子字元裡 迴圈節個數。。和出現迴圈節的 i 。。

(懂那個意思就好。。)

都說這題就是 2406 改良版。。。現在一看。。確實不假。。

 

以下為感覺可以AC的程式碼(POJ。。502了)

 

 

 

#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdio>
using namespace std;
const int maxn = 1e6 + 5;
int nex[maxn];
char str[maxn];
void getnex(char *str)
{
    int len =strlen(str);
    int i=0,j=-1;
    nex[0]=-1;
    while(i<len)
    {
        if(j==-1 || str[i]==str[j])
            nex[++i]=++j;
        else
            j=nex[j];
    }
}
int main()
{
    int leng;
    int cnt = 1;
    while(~scanf("%d",&leng) && leng)
    {
        scanf("%s",str);
        getnex(str);
        printf("Test case #%d\n", cnt++);
        for(int i=1;i<=leng;i++)
        {
            int l = i - nex[i];
            if(i != l && i % l == 0)
            {
                printf("%d %d\n",i , i/l);
            }
        }
    }
    return 0;
}