洛谷T90444 密碼 題解

Yoican發表於2020-08-22

【問題描述】
假髮通過了不懈的努力,得到了將軍家門鎖的密碼(一串小寫英文字母)。但是假髮被十四和猩猩他們盯上了,所以假髮需要把密碼傳遞出去。因為假髮不想十四他們發現幾鬆門前貼的小紙條就是將軍家的密碼,所以他加密了密碼(新八:聽起來有點詭異)。加密方法如下:隨機地,在密碼中任意位置插入隨機長度的小寫字串。
不過,假髮相信銀桑和他那麼多年小學同學,一定能猜中密碼是什麼的(新八:銀桑什麼時候成攮夷志士了!!!)。可是,寫完了小紙條之後,假髮覺得有點長,就想截去頭和尾各一段(可以為空),讓剩下的中間那一段依然包含真~密碼。想著想著,假髮就想知道有多少種可行方案。結果在沉迷於稿紙之際,假髮被投進了獄門島(新八:……)。於是,就由你計算了。
【輸入】
兩行非空字串,純小寫英文字母,第一行是加密後的密碼,第二行是原密碼。
第一行長度不超過300000,第二行不超過200。
【輸出】
一行,有多少種方案。注意:不剪也是一種方案。
【輸入輸出樣例】
abcabcabc
cba 9
【樣例解釋】
用(L,R)表示一種方案,其中L和R分別表示截去頭和尾的長度。這9鍾方案分別是(0,0),(0,1),(0,2),(1,0),(1,1),(1,2),(2,0),(2,1),(2,2)。
【資料說明】
30%的資料滿足第一行長度不超過1000。

這一題如果是純暴力做的話,只能拿到30分的好成績(。然而,這題的標算也是暴力(!),它是這樣寫的:
先記錄密碼第一位字母在第一個字串中的位置。如果匹配成功,就把第一位字母的位置傳遞下去;
每掃一次,就加上最後一位字母的位置;

這就是正解的全部內容!

上程式碼

 

#include<bits/stdc++.h>
using namespace std;
char a[300005],b[300005];
int f[300005];
long long ans;
int main(){
	gets(a+1);
	gets(b+1);
	int n=strlen(a+1),m=strlen(b+1);
	for(int i=1;i<=n;i++)
	{
		f[0]=i;
		for(int j=m;j>=1;j--)
		{
			if(a[i]==b[j]) f[j]=f[j-1];
		}
		ans+=f[m];
	}
	cout<<ans;
	return 0;
}

  

 

相關文章