NKOJ 密碼 [暴力]

NKOJ 密碼 [暴力]

問題描述

假髮通過了不懈的努力,得到了將軍家門鎖的密碼(一串小寫英文字母)。但是假髮被 十四和猩猩他們盯上了,所以假髮需要把密碼傳遞出去。因爲假髮不想十四他們發現幾鬆門 前貼的小紙條就是將軍家的密碼,所以他加密了密碼(新八:聽起來有點詭異)。加密方法 如下:隨機地,在密碼中任意位置插入隨機長度的小寫字符串。 不過,假髮相信銀桑和他那麼多年小學同學,一定能猜中密碼是什麼的(新八:銀桑什 麼時候成攮夷志士了!!!)。可是,寫完了小紙條之後,假髮覺得有點長,就想截去頭和 尾各一段(可以爲空),讓剩下的中間那一段依然包含真~密碼。想着想着,假髮就想知道 有多少種可行方案。結果在沉迷於稿紙之際,假髮被投進了獄門島(新八:……)。於是, 就由你計算了。

輸入格式

兩行非空字符串,純小寫英文字母,第一行是加密後的密碼,第二行是原密碼。
第一行長度不超過 300000,第二行不超過 200。

輸出格式

一行,有多少種方案。注意:不剪也是一種方案。

題解

好像沒什麼特別的算法…乘法原理??

i 爲在新密碼串中掃動的指針,j 爲在原密碼串(真密碼)中掃動的指針。解題的關鍵就在於不停地掃動ij 指針。固定原密碼串,一位一位地在新密碼串中匹配真密碼。當匹配完一串真密碼時,更新答案(注意是上一次匹配到的密碼串的開頭位置LastPos 與這一次的開頭位置CurPos 的差,即Ans+=(CurPosLastPos)(ni+1) 。不能不記錄LastPos ,否則會造成重複計算),並把i 移到CurPos+1 的位置<千萬不要忘記T^T>j 移到原密碼的第一位,然後重複以上操作。

注意細節(不剪也是一種方案)。

代碼

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char s1[300050],s2[250];
int main(){
    scanf("%s%s",s1+1,s2+1);
    int len1=strlen(s1+1),len2=strlen(s2+1);
    int i=1,j=1,Last,Cur=0;
    long long Ans=0;
    while(i<=len1){
        while(i<=len1 && s1[i]!=s2[j])i++;
        if(i>len1)break;
        if(j==1)Last=Cur,Cur=i;
        if(j==len2)Ans+=(long long)(Cur-Last)*(len1-i+1);
        i++,j++;
        if(j>len2)j=1,i=Cur+1;
    }
    printf("%lld",Ans);return 0;
}
發佈了129 篇原創文章 · 獲贊 16 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章