結果
| 問題 |
No.430 文字列検索
|
| コンテスト | |
| ユーザー |
kkktym
|
| 提出日時 | 2019-09-19 11:30:43 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
TLE
(最新)
AC
(最初)
|
| 実行時間 | - |
| コード長 | 1,412 bytes |
| コンパイル時間 | 767 ms |
| コンパイル使用メモリ | 66,976 KB |
| 実行使用メモリ | 6,816 KB |
| 最終ジャッジ日時 | 2024-11-10 00:33:25 |
| 合計ジャッジ時間 | 16,077 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 13 TLE * 1 |
ソースコード
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#define rep(i,n) for(int i=0;i<n;++i)
#define rep1(i,n) for(int i=1;i<=n;++i)
using namespace std;
struct KMP{
string s;
int n;
vector<int> table;
KMP(string _s)
{
s = _s;
n = s.size();
}
//kmpテーブルの作成
void make_kmp_table(string p)
{
int ps = p.size();
table.resize(ps+1);
table[0] = -1;
int j = -1;
rep(i,ps){
while(j>=0&&p[i]!=p[j]) j = table[j];
j++;
table[i+1] = j;
}
}
//kmp法
int kmp_search(string p)
{
int res;
make_kmp_table(p);
int ps = p.size();
bool f = false;
int i = 0,j = 0;
while(i<n){
while(s[i]==p[j]){
i++;j++;
if(j==ps){
f = true;
res = i-j;
break;
}
if(i==n) break;
}
if(j==0) i++;
else j = table[j];
}
return f?res:-1;
}
int kmp_count(string p)
{
int res = 0;
make_kmp_table(p);
int ps = p.size();
int i = 0,j = 0;
while(i<n){
while(s[i]==p[j]){
i++;j++;
if(j==ps){
res++;
}
if(i==n) break;
}
if(j==0) i++;
else j = table[j];
}
return res;
}
};
int main()
{
string s;
cin >> s;
KMP kmp(s);
int m;
cin >> m;
vector<string> c(m);
rep(i,m) cin >> c[i];
int res = 0;
rep(i,m){
res += kmp.kmp_count(c[i]);
}
cout << res << "\n";
return 0;
}
kkktym