UVa 11576 - Scrolling Sign Solution

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
string s,t;
vector<int> lps(100);
int ans;
void calc(){
    int m=s.size(),len=0;
    for(int i=1;i<m;){
        if(s[i]==s[len])
            lps[i++]=++len;
        else
            if(len)
                len=lps[len-1];
            else
                lps[i++]=0;
    }
}
void kmp(){
    ans=0;
    calc();
    int m=s.size(),n=t.size(),i=0,j=0;
    while(i<n){
        if(s[j]==t[i])
            i++,j++;
        if(j==m){
            ans=m,j=lps[j-1];
            return;
        }
        if(i==n){
            ans=j;
            return;
        }
        else if(i<n&&s[j]!=t[i])
            if(j)
                j=lps[j-1];
            else
                i++;
    }
}
int main(){
    int n;
    for(cin>>n;n;n--){
        t="";
        int k,w,val=0;
        for(cin>>k>>w;w;w--){
            cin>>s;
            kmp();
            val+=s.size()-ans;
            t=s;
        }
        cout<<val<<endl;
    }
}

Comments